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。
我是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。