禁止未初始化的perl警告



是否有一种方法可以在Perl文件中使用的所有库中仅对少数库抑制未初始化的Perl变量警告?

我想不出任何理由这将是一个好主意,当然使用一个未初始化的变量是一个bug,无论你从哪个角度看它?

但是,您可以使用以下命令关闭警告:

no warnings 'uninitialized';

再加上:

use warnings 'uninitialized';

如果用这两个语句将单个语句括起来,则可以禁用警告。

您可能使用了-w,它在整个解释器中启用警告(尽管可以使用local $^W = 0;no warnings;覆盖它)。

使用-w不是一件坏事。所有模块都应该容忍这种情况或进行防御(使用no warnings;)。但有些不是"警告安全"的。

use warnings;放置在每个脚本和模块中更为常规。这是启用警告的方法,因为它不会影响脚本和模块使用的其他第三方模块。

如果您能够修改违规模块,您可以将no warnings 'uninitialized';添加到模块本身,在任何sub声明之外,它将禁用模块中所有代码的警告类别,如以下两段代码所示:

In warntest:

#!/usr/bin/env perl    
use strict;
use warnings;
use 5.010;
use lib '.';
use UndefMod;
my $x;
say "Main before: $x";
UndefMod::test_mod;
say "Main after: $x";

UndefMod.pm中(在同一目录下):

package UndefMod;
use strict;
use warnings;
use 5.010;
no warnings 'uninitialized';
sub test_mod {
  my $x;
  say "Module: $x";
}
1;

当运行时,这对warntest中的say产生"使用未初始化值"警告,但对UndefMod中的say没有警告,从而表明两个文件的warnings设置对另一个文件没有影响。

当然,您可能无法修改模块源代码,在这种情况下,您可能不走运。Perl的作用域规则通常不允许从作用域外部修改作用域的警告/无警告状态。(我说"可能"one_answers"一般"是因为可能有一些黑魔法可以破解,可能至少与PadWalker背后的魔法有关,但这些事情超出了我的能力范围。)

最新更新