如何在Perl中为未使用的变量生成警告?

时间:2013-06-18 20:07:03

标签: perl variables warnings unused-variables

如何在Perl中为未使用的变量生成警告?

my $var1 = 0;
my $var2 = 10;
printf("%d",$var2);

应生成$var1未使用的警告

修改 我在我的脚本上尝试了perlcritic。它给了我几个警告: 这些意味着什么?无论如何,我没有看到任何未使用的变量警告。

#Bareword file handle opened at line 98, column 9.  See pages 202,204 of PBP.  (Severity: 5)
#Loop iterator is not lexical at line 1068, column 5.  See page 108 of PBP.  (Severity: 5)
#Subroutine prototypes used at line 553, column 1.  See page 194 of PBP.  (Severity: 5)
#Two-argument "open" used at line 1072, column 5.  See page 207 of PBP.  (Severity: 5)

2 个答案:

答案 0 :(得分:2)

您应该查看warnings::unused perl模块,它是为此目的而设计的。

你也可以像评论中所说的那样使用perlcritic

答案 1 :(得分:1)

关于使用perlcritic检测此问题的主题:

我误解了ProhibitUnusedVariables规则。它不适用于此,因为该规则的当前实现将赋值视为用途。

也就是说,它会在my $unused;上发出警告,但不会在my $unused = 1;上发出警告。

要使用perlcritic,您可以请求严重性,范围从默认的“温和”-5到“野蛮”-1

警告的简短说明:

  • 裸字文件句柄被认为已过时。使用词汇变量,例如open my $fh, ...;my $line = <$fh>

  • $_ - 样式循环中使用默认的foreach作为循环变量可能被视为一种不好的做法。通常最好引入一个新的词法变量,其范围仅限于循环,如

    for my $pet (@pets) {
      $pet->feed($pet->favourite_treat);
    }
    
  • 子例程原型是子定义后的parens中的事物,如sub foo() { ... }中所示。除非您已经知道Perl中的原型,否则不要使用它们,只需sub foo { ... }

  • 执行open之类的

    是一种很好的做法
    open my $fh, "<", $filename or die "Can't open $filename: $!";
    

    如果use autodie,则可以省略错误处理。显式模式可以避免shell注入(考虑有效的文件名rm -rf *; echo pwned |)。这是现代Perl必须的。

您可能不同意这些规则中的一些(至少我这样做,其中有两种情况)。您可以使用.perlcriticrc文件根据您的偏好修改规则。请参阅perlcritic documentation