gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:33:15 27 4
gpt4 key购买 nike

我正在使用配置文件(在 Y​​AML 中)来定义稍后用于验证我的应用程序所需的其他配置值的类型:

---
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 ...

想法是到 eval每个类型定义,将它们放入散列中,然后调用以验证配置数据(以下是示意图以便于理解):
#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 中的子程序似乎不接受参数。在上述情况下,第一个打印语句输出 -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.

这完全不是我所期望的,但是正在调用子程序。

我究竟做错了什么?

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

最佳答案

不要在配置中编写代码。使用代码创建一个库并简单地配置您要使用的子程序名称。这将为您节省大量将字符串转换为代码和管理流程的工作。当有人调整配置并引入语法错误时,它还可以为您节省大量时间来跟踪问题。

我在 Mastering Perl 的“配置”一章中广泛讨论了这一点。 ,以及关于动态子程序的章节。

代码不属于配置。说到你相信为止。

关于perl - 如何将参数传递给使用 eval 定义的 Perl 子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2094546/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com