Почему Perl жалуется на разные строки для разных видов предупреждений? - PullRequest
4 голосов
/ 19 июня 2011

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 ]

7 голосов
/ 19 июня 2011

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
3 голосов
/ 19 июня 2011

Некоторые предупреждения появляются во время синтаксического анализа, некоторые - во время выполнения.Во время синтаксического анализа Perl точно знает, какая строка включена, поэтому может правильно определить номер строки.Во время выполнения Perl на самом деле больше не имеет исходного кода, но имеет сгенерированный optree, в котором есть теги, позволяющие ему узнать, из какой строки он получен, за исключением того, что, возможно, были оптимизации или упрощения, из-за которых эта информация была слегка отключена..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...