Допустим, у меня есть следующий фрагмент кода:
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/.../ ) { } ...
проверок, которые затем вызывают динамические функции в зависимости от входной строки.