2012-03-14 21 views
4

我正在研究大约4000行的Perl CGI脚本。我们的编码风格通常包括use strictuse warnings,但在这个特定(相当古老)的文件中,“使用警告”被注释掉,并且注释表明启用警告会泛滥Apache日志。只能在一个子程序中使用“警告”吗?

现在我打算将一些代码分隔成一个新的子程序。我想至少在那里有use warnings。我怎样才能安全地限制use warnings对一个子程序的影响?只是将use子句放在子例程中就可以完成这项工作吗?

回答

13

是的,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


是什么文件说?

  • perldoc.perllexwarn

    该编译作品就像strict编译。 这意味着警告杂注的范围仅限于封闭块。它也 意味着杂注设置不会跨文件泄漏(通过使用, 要求或做)。这允许作者独立定义将应用于其模块的警告检查程度 。

+1

正确。你甚至可以比块更小,只需用'无警告'再次禁用警告; (介意最后的-s) – Konerak 2012-03-14 10:03:46

2

刚刚找到自己的答案在 “的perldoc perllexwarn”:

...the scope of the warning pragma is limited to the enclosing block. 

所以下面应该工作:

​​
4

是,其他人指出。但在我看来,建议您最好在全球范围内启用警告,并在有问题的部分代码中将其关闭。

use warnings; 

sub new_method { 
    # shiny new code 
} 

sub old_method { 
    no warnings; 

    # nasty old code 
} 
2

打开全局警告,然后关闭特定部分听起来像是一个很好的计划。

您不必在每个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 { ... } 
} 
2

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 

通过代码和修复的警告。很可能,如果脚本正在工作,它们将变得微不足道。但除非你检查,你怎么知道?

如果最终你认为它不值得修复所有警告的麻烦,那么只要删除警告和错误重定向,并使用警告词法。

相关问题