perl 用户提供的 sub,总是 returns 文本,而不是 eval

perl a user supplied sub, always returns the text, not the eval

我是perl新手

不幸的是,eval 并不像我期望的那样工作

我的模拟示例:

my $filter = 'return false;';
my $filterFunc = sub{ eval{ $filter } } ;
while (my $entry = readNextEntry()){
    print "Eval:".$filterFunc->( $entry )."\n";
}

当我 运行 这样做时,我得到了从每次传递返回的文字 "return false;"(而不是对函数进行求值)。我尝试了几种变体,但我没有找到神奇的组合。

关于安全隐患的说明:

作为用户,我对传入代码的作用没有安全顾虑。

我的目的是引入多个源并根据参数过滤掉一些东西,因为我不知道哪些参数会有用,我想我可以传入一些文本,eval text 到一个匿名函数中,并且 运行 每个记录的函数(一个过滤函数)。因为我是用户,所以我对传入代码的作用没有安全顾虑。

你需要做 string eval,而不是 block eval.

my $filterFunc = sub{ eval{ $filter } } ;

eval BLOCK 类似于 try/catch 机制。它不评估任意代码。它捕获块内代码中的错误。你想要的是字符串 eval.

my $filterFunc = sub{ eval $filter };

这是我认为您正在尝试做的事情的示例实现:

$ perl -E 'my $filter = sub { my $f = shift; eval $ARGV[0]; }; for ( 1 .. 10 ) { say $_ if $filter->($_) }' '$f % 2'
1
3
5
7
9

但是,Perl 中没有false。那不是关键字。除非你在某处有 sub false,这可能会给你一个语法错误,这取决于你是否有 use strict

你应该read up on eval.


如果您想要的只是 $filterFunc returns 某些 false,请改用 0。请注意,文字字符串 "return false;" 在 Perl 中是 true