Подтвердить что ты не робот

Какова цель директив perl #line?

Линейные директивы (#line) используются для перенастройки perl-представления текущего имени файла и номера строки. Когда требуется получить правильное имя файла и номер строки (в сообщении об ошибке)?

4b9b3361

Ответ 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). Используя линейные директивы, вы можете указать полезное имя файла и номер строки.