我需要将$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}}。
答案 0 :(得分:1)
我可能会给你太多绳索,这是我见过的最长的程序,增加1到2,但无论如何..
只要汇编并且有意义,您就可以在eval
中做任何您喜欢的事情。你所写的内容没有意义,我很难想象你正在写什么类,以及为什么它有main
方法
这是我想象的东西。假设您的模块名为Problem
,源代码如下
您将它用作面向对象的模块,因此我必须编写一个最小new
方法。我尽可能少地更改了main
和add
方法,以便它们至少可以编译和运行
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和名称?
这是一个使用修订模块的程序
add
use strict;
use warnings 'all';
use feature 'say';
use Problem;
my $pb = Problem->new;
say $pb->main('1, 2', 'add');
老实说,我想不出更多的话要说。你留下了很多未回答的问题