我正在研究大约4000行的Perl CGI脚本。我们的编码风格通常包括use strict
和use warnings
,但在这个特定(相当古老)的文件中,“使用警告”被注释掉,并且注释表明启用警告会泛滥Apache日志。只能在一个子程序中使用“警告”吗?
现在我打算将一些代码分隔成一个新的子程序。我想至少在那里有use warnings
。我怎样才能安全地限制use warnings
对一个子程序的影响?只是将use
子句放在子例程中就可以完成这项工作吗?
我正在研究大约4000行的Perl CGI脚本。我们的编码风格通常包括use strict
和use warnings
,但在这个特定(相当古老)的文件中,“使用警告”被注释掉,并且注释表明启用警告会泛滥Apache日志。只能在一个子程序中使用“警告”吗?
现在我打算将一些代码分隔成一个新的子程序。我想至少在那里有use warnings
。我怎样才能安全地限制use warnings
对一个子程序的影响?只是将use
子句放在子例程中就可以完成这项工作吗?
是的,use warning
的使用将在您所写的范围内。
写入use warning
里面的子只会影响给定例程(或块)。
例如片断
sub foo {
use warnings;
print my $a;
}
{
use warnings;
print my $b;
}
foo;
print my $c;
输出
Use of uninitialized value $b in print at foo.pl line 8.
Use of uninitialized value $a in print at foo.pl line 3.
注意,没有警告抛出有关使用print my $c
。
是什么文件说?
该编译作品就像strict编译。 这意味着警告杂注的范围仅限于封闭块。它也 意味着杂注设置不会跨文件泄漏(通过使用, 要求或做)。这允许作者独立定义将应用于其模块的警告检查程度 。
刚刚找到自己的答案在 “的perldoc perllexwarn”:
...the scope of the warning pragma is limited to the enclosing block.
所以下面应该工作:
是,其他人指出。但在我看来,建议您最好在全球范围内启用警告,并在有问题的部分代码中将其关闭。
use warnings;
sub new_method {
# shiny new code
}
sub old_method {
no warnings;
# nasty old code
}
打开全局警告,然后关闭特定部分听起来像是一个很好的计划。
您不必在每个sub
的范围内放置use warnings;
或no warnings;
。您可以使用大括号来创建专门的范围,例如。
use warnings;
sub nice_new_sub_1 { ... }
sub nice_new_sub_2 { ... }
{
no warnings;
sub nasty_old_sub_3 { ... }
sub nasty_old_sub_4 { ... }
sub nasty_old_sub_5 { ... }
}
此外,请考虑只关闭那些需要使其工作干净的警告,例如,
{
no strict 'refs';
sub nasty_old_sub_3 { ... }
sub nasty_old_sub_4 { ... }
}
use warnings
可以在词汇上使用的答案是正确的。全球使用no warnings
词法和use warnings
的解决方案更为正确。最好的解决方案是修复所有警告。介于两者之间的地方在于重定向错误。
use warnings;
open STDERR, ">>", "foo/error.log" or die $!;
把它留给了一段时间,然后运行:
perl -nlwe '$a{$_}++ }{ print for keys %a' foo/error.log > foo/errors.dedupe
通过代码和修复的警告。很可能,如果脚本正在工作,它们将变得微不足道。但除非你检查,你怎么知道?
如果最终你认为它不值得修复所有警告的麻烦,那么只要删除警告和错误重定向,并使用警告词法。
正确。你甚至可以比块更小,只需用'无警告'再次禁用警告; (介意最后的-s) – Konerak 2012-03-14 10:03:46