比方说,我有如下一段代码:我可以在Perl的硬编码地址中调用子程序吗?
my $compiled = eval 'sub { print("Hello World\n"); }';
我可以写调用这个:
$compiled->();
到目前为止好。现在想象我创造10个功能:
my @fns =();
for (my $i = 0; $i < 10; $i++) {
push(@fns, eval "sub { print('I am function $i\n'); }");
}
我可以打电话给这10个功能如下:
foreach (@fns) {
$_->();
}
现在,我想创建一个调用我的每一个10个功能明确动态功能:
my $evalcode = "sub {";
foreach (@fns) {
# if I print $_ it shows something like
# "CODE(0x94084f8)", but trying to
# call "CODE(0x94084f8)->()" is invalid
$evalcode .= "$_->();";
}
$evalcode .= "}";
my $dynamic_fn = eval $evalcode;
$dynamic_fn->();
是否可以对子例程进行字符串化引用并直接调用它?
PS为什么,你问?因为我想编写一个动态例程,构造一个if (m/.../) { } elsif (m/.../) { } ...
检查链,然后根据输入字符串调用动态函数。
我打算提出这个建议,但我认为它不会为OP做。我认为不同潜艇的代码是动态生成的,这就是为什么他们想要使用eval。 – 2010-10-01 15:07:05
它会的。第二次关闭是重要的一点。之前生成的函数列表也可以使用字符串eval生成。但是,我仍然认为有办法做OP的任何事情,而不必依赖于'eval STRING'。关闭非常强大。 – rafl 2010-10-01 15:09:18