添加use strict到perl程序会禁用重要的警告消息.这是perl中的错误吗?
这个小程序有问题
#!/usr/bin/perl -w
my $rule;
sub applyRule() {
eval $rule;
}
my $foo_bar;
$foo_bar = "mega-foo-bar-ness";
$rule = 's/#FOO_BAR/$foo_bar/g';
$_ = "Please replace #FOO_BAR with something.";
applyRule();
print STDERR "OUTPUT: $_\n";
Run Code Online (Sandbox Code Playgroud)
我们在运行该程序时收到一条有用的警告信息:
$ ./test1.pl
Use of uninitialized value $foo_bar in substitution (s///) at (eval 1) line 1.
OUTPUT: Please replace with something.
Run Code Online (Sandbox Code Playgroud)
现在添加 use strict;
#!/usr/bin/perl -w
use strict;
my $rule;
sub applyRule() {
eval $rule;
}
my $foo_bar;
$foo_bar = "mega-foo-bar-ness";
$rule = 's/#FOO_BAR/$foo_bar/g';
$_ = "Please replace #FOO_BAR with something.";
applyRule();
print STDERR "OUTPUT: $_\n";
Run Code Online (Sandbox Code Playgroud)
替换只是默默地失败了.
$ ./test1.pl
OUTPUT: Please replace #FOO_BAR with something.
Run Code Online (Sandbox Code Playgroud)
当我在perl中use strict遇到神秘错误时,我应该总是尝试移除以查看是否收到一些有用的警告?
编辑1 stackoverflow要求我描述为什么这不是为什么使用严格和警告的重复?.在这种情况下,添加use strict结果的警告更少,这使得调试更加困难 - 与我期望的相反use strict; 与该问题的答案中建议的相反:
pragma比其他方法更快地捕获许多错误,这使得更容易找到错误的根本原因.
编辑2:对于其他人看到这个:另一种方式是:
defined (eval $rule) or warn "eval error: $@\n";
Run Code Online (Sandbox Code Playgroud)
因为如果有错误,eval会返回undefined.该编程Perl的书在有关部分规定eval
如果存在语法错误或运行时错误,eval将返回未定义的值并将错误消息放入$ @.如果没有错误,则保证$ @被设置为空字符串,因此您可以在之后可靠地测试它是否存在错误.
yst*_*sth 20
它会抛出异常,而不是警告.你没有测试是否eval给了一个例外.
尝试:
eval "$rule; 1" or warn "exception thrown: $@\n";
Run Code Online (Sandbox Code Playgroud)