Линейные директивы (#line) используются для перенастройки perl-представления текущего имени файла и номера строки. Когда требуется получить правильное имя файла и номер строки (в сообщении об ошибке)?
Какова цель директив perl #line?
Ответ 1
Обычно такие маркеры помещаются в код, который был предварительно обработан или механически сгенерирован, чтобы вернуться к источнику, генерируемому человеком.
Например, если была программа, которая преобразует Python в Perl, она может вставить
# line 812 "foo.py"
чтобы сообщения об ошибках ссылались на исходный код Python, который имел бы больше смысла для программиста.
Ответ 2
Они полезны при переносе Perl script в другой файл, например pl2bat. Perl не видит командные команды в начале файла, которые отбрасывают идею чисел строк. Директива A #line
в начале источника Perl компенсирует это.
Ответ 3
Я несколько раз видел, что люди неправильно записывают текущий номер строки в директиву #line. Он должен содержать следующий номер строки. Пример кода linetest.pl(с использованием оболочки ksh для установки переменной среды для perl script):
1 #!/usr/bin/ksh
2 MY_ENV_VAR='something'
3 export MY_ENV_VAR
4 /usr/bin/perl -x $0 [email protected] 2>&1
5 exit $?
6
7 #!/usr/bin/perl
8 #line 9
9 print "MY_ENV_VAR is $ENV{MY_ENV_VAR}\n";
10 die "This is line 10.";
Запустите script и проверьте результат:
$ ./linetest.pl
MY_ENV_VAR is something
This is line 10. at ./linetest.pl line 10.
Вы можете видеть, что номера строк соответствуют после записи #line 9
в строке 8.
Ответ 4
В дополнение к уже упомянутым причинам perl
имеет (сильно обескураженный) параметр -P
, который запускает файл Perl через препроцессор C до его выполнения. Так как большинство препроцессоров C будут использовать директивы линии, когда они включают или удаляют часть файла, поэтому любые ошибки будут сообщаться из того места, где они были расположены в исходном источнике, а не в обработанном источнике.
Директивы линий также могут быть очень полезны, если вы генерируете код в строках, который затем передается в eval
. Обычно, если в этом коде есть предупреждение или ошибка, вы получаете сообщение об ошибке "умер в (1) 1). Используя линейные директивы, вы можете указать полезное имя файла и номер строки.