perl – 安全隔间中的“无警告”
发布时间:2020-12-16 06:29:12 所属栏目:大数据 来源:网络整理
导读:我使用 reval从Perl的 Safe模块,我想阻止它产生警告如果被eval’ed字符串不能被解析(实际上,我想阻止它产生任何警告的话). 例如,以下代码: use strict; use warnings;use Safe; use feature qw/say/;my $cft = Safe-new;my $x = $cft-reval(') 1' );my $y =
我使用
reval从Perl的
Safe模块,我想阻止它产生警告如果被eval’ed字符串不能被解析(实际上,我想阻止它产生任何警告的话).
例如,以下代码: use strict; use warnings; use Safe; use feature qw/say/; my $cft = Safe->new; my $x = $cft->reval(') 1' ); my $y = $cft->reval('2' ); say "x: $x"; say "y: $y"; 结果是: Number found where operator expected at (eval 5) line 1,near ") 1" (Missing operator before 1?) Use of uninitialized value $x in concatenation (.) or string at ./test line 12. x: y: 2 我想要实现的是$x = undef和$y = 2,没有警告. use strict; use warnings; use Safe; use feature qw/say/; my $cft = Safe->new; { no warnings; my $x = $cft->reval(') 1' ); my $y = $cft->reval('2' ); say "x: $x"; say "y: $y"; } 我想不管怎么说’没有警告’必须在安全隔间内,所以我也尝试在“没有警告”前面加上被评估的字符串: use strict; use warnings; use Safe; use feature qw/say/; my $cft = Safe->new; { my $x = $cft->reval( 'no warnings;' . ') 1' ); my $y = $cft->reval( 'no warnings;' . '2' ); say "x: $x"; say "y: $y"; } 这种方式reval不会发出任何警告,但两个变量都是undef: Use of uninitialized value $x in concatenation (.) or string at ./test line 10. x: Use of uninitialized value $y in concatenation (.) or string at ./test line 11. y: 我不知道还有什么可以尝试,我希望问题描述足够清楚. 解决方法
如果你检查$@,你会看到$cft-> reval(‘no warnings;’.’)1′);失败. ‘require’被(eval 5)第1行的操作掩码捕获.换句话说,Safe正在执行其工作并阻止该代码尝试加载库.
$cft-> reval(‘BEGIN {warnings-> unimport;})1’);会工作,假设警告已经装在车厢外.但是,这不会安静编译时错误.与eval不同,reval似乎让他们通过.使用amon安静STDERR的技巧. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |