将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";
我们在运行该程序时会收到一条有用的警告消息:
$ ./test1.pl
Use of uninitialized value $foo_bar in substitution (s///) at (eval 1) line 1.
OUTPUT: Please replace with something.
现在添加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";
替换只是默默地失败。
$ ./test1.pl
OUTPUT: Please replace #FOO_BAR with something.
当我在perl中遇到神秘错误时,我应该尝试删除use strict
以查看是否收到一些有用的警告?
编辑1 stackoverflow要求我描述为什么这不是Why use strict and warnings?的副本。在这种情况下,添加use strict
会导致更少的警告,这会使调试变得更难 - 与我期望的use strict
相反;与该问题的答案中建议的相反:
pragma比其他方法更快地捕获到许多错误,这使得更容易找到错误的根本原因。
编辑2 :对于其他人看到这一点:另一种方式是:
defined (eval $rule) or warn "eval error: $@\n";
因为如果有错误,eval会返回undefined。 Programming Perl 一书在关于eval
如果存在语法错误或运行时错误,eval将返回未定义的值并将错误消息放入$ @。如果没有错误,$ @保证被设置为空字符串,因此您可以在之后可靠地测试它是否有错误。
但请注意with versions prior to Perl 5.14 there can be problems relying on '$@`。
答案 0 :(得分:20)
而不是警告,它会抛出异常。你没有测试是否eval给了例外。
尝试:
eval "$rule; 1" or warn "exception thrown: $@\n";