如何在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)
答案 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