比方說,我有如下一段代碼:我可以在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