例如,以下代码:
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,没有警告.
我试图提出“没有警告;”在新范围内,但它对reval中产生的警告没有影响(尽管如@DavIDO指出的那样,它会使’未初始化值’警告静音):
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的技巧.
总结以上是内存溢出为你收集整理的perl – 安全隔间中的“无警告”全部内容,希望文章能够帮你解决perl – 安全隔间中的“无警告”所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)