在perl中';使用严格的';禁用重要警告

在perl中';使用严格的';禁用重要警告,perl,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."; appl

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
在(eval 1)第1行的替换(s//)中使用未初始化值$foo_bar。
输出:请用某物替换。
现在添加
使用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
输出:请用某物替换#FOO#u BAR。
当我在perl中出现神秘错误时,我是否应该总是尝试删除
使用strict
来查看是否得到一些有用的警告

编辑1stackoverflow要求我描述为什么这不是的副本。在这种情况下,添加
use strict
会导致更少的警告,这使得调试更加困难——这与我所期望的
use strict
相反;与该问题的答案相反:

pragmas捕捉到许多错误的速度比其他情况下要快,这使得更容易找到错误的根本原因

编辑2:对于其他看到这一点的人:另一种方法是:

defined (eval $rule) or warn "eval error: $@\n";
因为如果有错误,eval返回undefined。《编程Perl》一书在关于
eval

如果存在语法错误或运行时错误,eval将返回未定义的值,并将错误消息放入$@。如果没有错误,$@将被保证设置为空字符串,因此您可以在之后可靠地测试它是否有错误


但是请注意。

它抛出异常,而不是警告。你不是在测试eval是否给出了异常

尝试:


short可能重复:添加“use warnings'all';”以改进脚本。如果省略
use strict
,则使用未声明的变量不会导致编译时失败。因此,
eval
将成功,但会打印一条警告。如果包含
使用严格的
评估
将失败,并且不会打印任何警告。为什么要使用
评估
?这里完全没有必要。不要在子声明中使用空括号,它不会添加任何您需要的内容,并且它与其他语言中的工作方式不同。子声明中的括号用于添加原型,用于帮助子例程像某些内置函数一样工作。(例如,
map{…}@list
push@array,$value
)谢谢,我学到了在使用
eval
时需要明确检查错误。(我仍然认为
use strict
导致警告消失很奇怪,但我知道这是因为
eval
有一种特殊的报告错误的方式)。字符串化未定义的值时会出现警告,但use strict会使警告在eval编译
$rule
时消失,在它开始替换搜索之前
eval "$rule; 1" or warn "exception thrown: $@\n";