加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

我可以在Perl的硬编码地址调用子程序吗?

发布时间:2020-12-15 23:31:41 所属栏目:大数据 来源:网络整理
导读:假设我有以下代码: my $compiled = eval 'sub { print( "Hello Worldn" ); }'; 我可以这样写: $compiled-(); 到现在为止还挺好.现在假设我创建了10个函数: my @fns = ();for ( my $i = 0; $i 10; $i++ ) { push( @fns,eval "sub { print( 'I am function
假设我有以下代码:

my $compiled = eval 'sub { print( "Hello Worldn" ); }';

我可以这样写:

$compiled->();

到现在为止还挺好.现在假设我创建了10个函数:

my @fns = ();
for ( my $i = 0; $i < 10; $i++ ) {
  push( @fns,eval "sub { print( 'I am function $in' ); }" );
}

我可以按如下方式调用这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 /…/){} …链,然后根据输入字符串调用动态函数.

解决方法

您可能希望使用常规的词法闭包,而不是字符串evals:

my @functions;

for my $i (0 .. 9) {
    push @functions,sub { print "I am function $in" };
}

my $call_all_funcs = sub {
    for my $func (@functions) {
        $func->();
    }
};

$call_all_funcs->();

也可以根据其地址检索代码引用,但这样更复杂,更难理解,并且通常不是一个好主意.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读