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.
是什么原因引起的?这种行为何时有用?
答案 0 :(得分:7)
内部警告的行号 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,它有标签让它知道它来自哪条线,除非可能有优化或简化导致此信息稍微关闭