我使用的是Perl的Safe模块中的reval,我想阻止它在生成警告时无法解析被评估的字符串(实际上,我想阻止它生成任何警告) 。“没有警告;”在安全隔间
例如,下面的代码:在
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 =民主基金和$ Y = 2,且无警告。 我试图提出“没有警告;”一个新的范围内,但它从重估中产生的警告没有效果(虽然,正如@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";
}
我想,不知何故'没有警告'必须放在安全隔间内,所以我也试图在“无警告”之前加上警告。琴弦被eval'ed:
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";
}
这样重估不发出任何警告,但两个变量都是民主基金:
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:
我不知道什么尝试,我希望问题描述足够清楚。
您的第二次尝试实际上不会产生与第一次相同的输出。它仍然会产生“编译时”错误(实际上是reval编译时错误),但不会产生与在'say'语句中插入未初始化值有关的运行时警告。所以你已经在上面的第二个片段中解决了你的一半问题(压制了警告)。另一半(压制编译时错误)更成问题。 – DavidO 2012-07-26 21:20:46
是的,你说得对。我甚至没有注意到,因为我在这里主要关心的是重新评估 - 未初始化的变量警告是我试图保持示例简短的结果。无论如何,我已更新了该帖子以使其更清晰。谢谢! – andrefs 2012-07-26 21:33:01