perl – 安全隔间中的“无警告”

perl – 安全隔间中的“无警告”,第1张

概述我使用 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,没有警告.
我试图提出“没有警告;”在新范围内,但它对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 – 安全隔间中的“无警告”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1260485.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存