在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

上一篇: in perl, 'use strict' disables important warnings

下一篇: Why can't I assign this perl sub to a variable?