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

如何将参数传递给使用eval定义的Perl子例程?

发布时间:2020-12-16 06:20:12 所属栏目:大数据 来源:网络整理
导读:我正在使用配置文件(在YAML中)来定义稍后用于验证我的应用程序所需的其他配置值的类型: ---action: use List::MoreUtils; my $value = $_; any { $value eq $_ } qw(fatal keep merge non-fatal replace);dir : return defined $_ ? -d $_ : -1;file : retu
我正在使用配置文件(在YAML中)来定义稍后用于验证我的应用程序所需的其他配置值的类型:

---
action: >
        use List::MoreUtils;
        my $value = $_;
        any { $value eq $_ } qw(fatal keep merge non-fatal replace);
dir   : return defined $_ ? -d $_ : -1;
file  : return defined $_ ? -f $_ : -1;
string: 1;


---
config-element:
    value: foo
    type : file
etc ...

我们的想法是评估每个类型定义,将它们抛入哈希,然后调用以验证配置数据(以下是为了便于理解而示意图):

#throw sub refs into hash
my %type_sub;
foreach my $key (keys %$type_def_ref) {
    my $sub_str = "sub {$type_def_ref->{$key}}";
    $type_sub{$key} = eval $sub_str;

}

#validate (myfile is a real file in the cwd)
print $type_sub{file}->('myfile'),"n";
print $type_sub{action}->('fatal'),"n";

问题是%type_sub中的子程序似乎不接受参数.在上面的例子中,第一个print语句输出-1,而第二个输出输出:

Use of uninitialized value $value in string eq at (eval 15) line 1.
Use of uninitialized value $_ in string eq at (eval 15) line 1.
Can't call method "any" without a package or object reference at 
(eval 15) line 1.

这根本不是我所期望的,但子程序正在被调用.

我究竟做错了什么?

编辑:
我很草率,现在一切正常.感谢弗里多.

解决方法

您的子例程参数将在@_数组中,而不是$_.要获取第一个参数,请查看$_ [0]或执行$foo = shift;. (默认情况下,shift会在@_上运行.)

至于任何,我认为问题是由于任何无法在运行时加载其原型(子程序原型只能在编译时调用.)您可能需要使用显式的parens和显式子程序引用:

any( sub { $value eq $_ },qw(fatal keep merge non-fatal replace) );

(编辑:李大同)

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

    推荐文章
      热点阅读