抑制未经初始化的perl警告

时间:2015-10-26 08:16:27

标签: perl

有没有办法可以为Perl文件中使用的所有库中的少数几个库抑制未初始化的Perl变量警告?

3 个答案:

答案 0 :(得分:1)

我想不出任何理由这是一个好主意,肯定使用一个未初始化的变量是一个从你看它的角度来看的错误?

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

no warnings 'unintialized';

再次与:

use warnings 'unintialized';

如果用这两个语句包围它,可以禁用单个语句的警告。

答案 1 :(得分:1)

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

使用-w并不是件坏事。所有模块都应该容忍这种情况或对其进行辩护(使用no warnings;)。但有些不是“警告 - 安全”。

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

答案 2 :(得分:0)

如果您能够修改有问题的模块,则可以在任何no warnings 'uninitialized';声明之外向模块本身添加sub,并且它将禁用该类别的警告对于模块中的所有代码,正如这两段代码所示:

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;

运行时,会产生"使用未初始化的值" saywarntest的警告,但say中的UndefMod没有警告,因此显示文件的warnings设置没有对另一方的影响。

当然,您可能无法修改模块源,在这种情况下您可能会运气不好。 Perl的范围规则通常不允许您从该范围之外修改范围的警告/无警告状态。 (我说"可能"和#34;一般"因为可能会有一些黑魔法来破解它,可能至少与PadWalker背后的魔法有关,但这些事情超出了我的想法。 )