在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";