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

如何使用变量名[per]调用perl中的子例程

发布时间:2020-12-15 23:35:17 所属栏目:大数据 来源:网络整理
导读:参见英文答案 How can I elegantly call a Perl subroutine whose name is held in a variable?????????????????????????????????????12个 假设我有一个包含所有子程序名称的数组,我想逐个调用. foreach $sub (@arr){ print "Calling $subn"; #---How to ca
参见英文答案 > How can I elegantly call a Perl subroutine whose name is held in a variable?????????????????????????????????????12个
假设我有一个包含所有子程序名称的数组,我想逐个调用.

foreach $sub (@arr){
      print "Calling $subn";
       #---How to call $sub?----
       &$sub;  ## will not work
}

解决方法

您的代码一般是正确的,但您需要关闭 strict 'refs'以使Perl允许您使用变量内容作为代码引用.

use strict;
use warnings;

sub foo { print "foo" }
sub bar { print "bar" }

my @arr = qw/foo bar/;
foreach my $sub (@arr) {
    no strict 'refs';
    print "Calling $subn";

    &$sub();
}

这里的输出是:

Calling foo
fooCalling bar
bar

我在调用后还添加了括号().这样我们就不会向%$sub传递任何参数.如果我们不这样做,将使用当前子例程的@_参数列表.

但是,你可能不应该这样做.特别是如果@arr包含用户输入,这是一个大问题.您的用户可以注入代码.考虑一下:

my @arr = qw/CORE::die/;

现在我们得到以下输出:

Calling CORE::die
Died at /home/code/scratch.pl line 1492.

哎呀.你不想这样做.模具示例并不是很糟糕,但是像这样你可以很容易地在一些不合适的包中调用代码.

制作一个dispatch table可能更好.有一整章关于Mark Jason Dominus的高阶Perl,你可以download for free on his website.

它基本上意味着您将所有subs作为代码引用放入哈希,然后在循环中调用它们.这样你就可以控制哪些是允许的.

use strict;
use warnings;

sub baz { print "baz" }

my %dispatch = (
    foo => sub { print "foo" },bar => sub { print "bar" },baz => &;baz,);

my @arr = qw/foo bar baz wrong_entry/;
foreach my $sub ( @arr ) {
    die "$sub is not allowed" 
        unless exists $dispatch{$sub};

    $dispatch{$sub}->();
}

这输出:

foobarbaz
wrong_entry is not allowed at /home/code/scratch.pl line 1494.

(编辑:李大同)

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

    推荐文章
      热点阅读