在perl中,'严格使用'会禁用重要警告
对perl程序添加use strict
会禁用重要的警告消息。 这是一个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是要求我来描述为什么这不是重复的为什么使用严格和警告? 在这种情况下, use strict
结果会导致更少的警告,这使得调试变得更加困难 - 与我期望的use strict
相反; 与该问题的答案中提出的内容相反:
这些编译指令很快就会捕捉到许多错误,否则会更容易找到错误的根本原因。
编辑2 :对于其他人看到这个:另一种方法是:
defined (eval $rule) or warn "eval error: $@n";
因为如果有错误,eval将返回undefined。 编程Perl书在关于eval
的部分中说明
如果有语法错误或运行时错误,eval会返回未定义的值并将错误消息放入$ @中。 如果没有错误,$ @被保证设置为空字符串,所以你可以在之后可靠地测试它是否有错误。
但请注意,在Perl 5.14以前的版本中,可能会依赖'$ @`出现问题。
它会引发异常而不是警告。 而且你没有测试eval是否给出了异常。
尝试:
eval "$rule; 1" or warn "exception thrown: $@n";
链接地址: http://www.djcxy.com/p/59227.html