Какова цель директив Perl #line? - PullRequest
13 голосов
/ 10 марта 2010

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

Ответы [ 4 ]

16 голосов
/ 10 марта 2010

Обычно такие маркеры помещаются в код, который был предварительно обработан или сгенерирован механически, чтобы отсылать назад к сгенерированному человеком источнику.

Например, если существует программа, которая конвертирует Python в Perl, она может вставить

# line 812 "foo.py"

, чтобы сообщения об ошибках ссылались на исходный код Python, который имел бы больше смысла для программиста.

7 голосов
/ 10 марта 2010

Они полезны при переносе скрипта Perl в другой файл, как это делает pl2bat. Perl не видит пакетные команды в начале файла, который отбрасывает его представление о номерах строк. Директива #line в начале источника Perl компенсирует это.

6 голосов
/ 21 апреля 2012

Я несколько раз видел, как люди неправильно записывают номер строки current в директиву #line. Он должен содержать номер строки next . Пример кода linetest.pl (использование оболочки ksh для установки переменной среды для сценария perl):

1  #!/usr/bin/ksh
2  MY_ENV_VAR='something'
3  export MY_ENV_VAR
4  /usr/bin/perl -x $0 $@ 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.";

Запустите скрипт и проверьте результат:

$ ./linetest.pl
MY_ENV_VAR is something
This is line 10. at ./linetest.pl line 10.

Вы можете видеть, что номера строк совпадают после записи #line 9 в строке 8.

1 голос
/ 11 марта 2010

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

Строковые директивы также могут быть очень полезны, если вы генерируете код в строках, который затем передается в eval. Обычно, если в таком коде есть предупреждение или ошибка, вы получаете сообщение об ошибке типа «умер в (eval 1) строке 1». Используя строковые директивы, вы можете указать полезное имя файла и номер строки.

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