在perl中,'use strict'禁用重要警告

时间:2016-03-23 22:34:58

标签: perl

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 '$@`

1 个答案:

答案 0 :(得分:20)

而不是警告,它会抛出异常。你没有测试是否eval给了例外。

尝试:

eval "$rule; 1" or warn "exception thrown: $@\n";
相关问题