为什么perl会抱怨不同类型警告的不同行?

时间:2011-06-19 12:35:24

标签: perl warnings

Perl通常会抱怨实际错误,例如:当变量只使用一次时:

use warnings;
if ( 0 ) {
} elsif ( $test ) { } # line 3
# Name "main::test" used only once: possible typo at testt.pl line 3.

这不适用于使用未初始化的$_

的警告
use warnings;
if ( 0 ) { # line 2
} elsif ( chomp ) { }
# Use of uninitialized value $_ in scalar chomp at testt.pl line 2.

use warnings;
if ( 0 ) { # line 2
} elsif ( m/test/ ) { }
# Use of uninitialized value $_ in pattern match (m//) at testt.pl line 2.

是什么原因引起的?这种行为何时有用?

2 个答案:

答案 0 :(得分:7)

perldoc perl5101delta

  

内部警告的行号   elsif现在是正确的。

请注意,此更改仅影响elsif;您仍然会看到运行时错误/警告给出语句的开头或结尾行号而不是违规代码的实际行:

$ perl
use warnings;
0 ? do {
} : $test ? do {
} : do { };

0 ? do {
} : chomp() ? do {
} : do { };
Name "main::test" used only once: possible typo at - line 3. # correct
Use of uninitialized value $_ in scalar chomp at - line 8.   # incorrect

答案 1 :(得分:3)

在解析过程中会引发一些警告,有些警告会在执行期间引发。在解析过程中,Perl确切知道它所在的哪一行可以获得正确的行号。在执行期间,Perl实际上不再拥有源代码,但确实有生成的optree,它有标签让它知道它来自哪条线,除非可能有优化或简化导致此信息稍微关闭