将自我传递给Perl中{eval}评估的函数

时间:2016-06-13 18:47:21

标签: perl parameter-passing eval

我需要将$self传递给Perl中由eval评估的函数。 这是程序:

#!/usr/bin/perl
use strict;
use warnings;

my $a = a->new();
my $my_job = "job('hello_world')";
eval $my_job;

package a;
sub new
{
    my $class = shift;
    my $self = {'first' => 'foo', 'last' => 'bar'};
    bless($self, $class);
}

sub job
{
    my ($self, $entity) = @_;
    print($self->{'first'} . "\n");
    print("$entity\n");
}

我期待输出为:

foo
hello world

但由于job()期待$self,因此无效。我需要将$a传递给评估eval的{​​{1}}。

1 个答案:

答案 0 :(得分:1)

我可能会给你太多绳索,这是我见过的最长的程序,增加1到2,但无论如何..

只要汇编并且有意义,您就可以在eval中做任何您喜欢的事情。你所写的内容没有意义,我很难想象你正在写什么类,以及为什么它有main方法

这是我想象的东西。假设您的模块名为Problem,源代码如下

您将它用作面向对象的模块,因此我必须编写一个最小new方法。我尽可能少地更改了mainadd方法,以便它们至少可以编译和运行

Problem.pm

package Problem;

use strict;
use warnings;

sub new {
    bless {};
}

sub main {
     my $self = shift;
     my ($arg, $subroutine) = @_;

     my @arg = $arg =~ /[^,\s]+/g;

     my $ret_val = eval q{$self->$subroutine(@arg)};
}

# where $subroutine = add(a,b) is a function defined as follows:

sub add {
    my $self = shift;

    my $a = shift;
    my $b = shift;
    my $c = $a + $b;

    return $c;

    # do some other stuff using $self

    my @test = (
        $self->{'id'},
        $self->{'name'},
    );

    # do stuff...
}

1;

我发现你的add方法非常奇怪。我希望有一个带有该名称的方法可以将值一起添加,但是从参数数组中取出$a$b并将它们添加到$c之后,您的代码就会关闭并访问{{1对象的{}和id值,然后抛弃它们。为什么name方法需要知道其对象的ID和名称?

这是一个使用修订模块的程序

problem.pl

add

输出

use strict;
use warnings 'all';
use feature 'say';

use Problem;

my $pb = Problem->new;

say $pb->main('1, 2', 'add');

老实说,我想不出更多的话要说。你留下了很多未回答的问题