#perl
#perl
Вопрос:
Я бы хотел perl -cw … чтобы вернуть ненулевой статус выхода, если выдается предупреждение о компиляции.
Например. предположим, a.pm
является ли файл:
use warnings;
asd;
Затем perl -cw a.pm
сообщает:
Unquoted string "asd" may clash ...
Useless use of a constant in void context ...
a.pm syntax OK
и статус выхода установлен в 0. Я хотел бы иметь возможность определять, что были выданы предупреждения о компиляции — предпочтительно через настройку статуса выхода.
Ответ №1:
Установите обработчик предупреждения в BEGIN
блоке (в верхней части скрипта, чтобы этот блок анализировался перед кодом, который может вызывать предупреждения во время компиляции), и настройте статус выхода в END
CHECK
заблокировать.
use strict;
use warnings;
my $warnings;
BEGIN {
$SIG{__WARN__} = sub { $warnings ; CORE::warn @_ }
}
$used::only::once = 42;
CHECK {
if ($^C amp;amp; $warnings > 0) {
exit $warnings;
}
}
$^C
Переменная имеет значение true тогда и только тогда, когда вы вызывали perl
с -c
опцией.
Комментарии:
1. В режиме проверки синтаксиса конечный блок не вызывается. Вы можете проверить это очень просто:
perl -c -e'END { print "End blockn" }'
. Если бы это было так — мы могли бы использовать просто пользовательскую прагму для подсчета предупреждений и настройки статуса выхода2. @yko — Извините, я сначала неправильно прочитал часть об использовании
-c
. Исправлено.
Ответ №2:
Насколько я знаю, это невозможно. В конце концов, это всего лишь рекомендательные уведомления, а не строго (без каламбура) ошибки. И наоборот, вы можете добавлять предупреждения к фатальным ошибкам во время выполнения, если это помогает решить вашу задачу.
$ perl -M'warnings FATAL=>q(all)' -cw a.pm ; echo $?
Unquoted string "asd" may clash with future reserved word at a.pm line 2.
255
Комментарии:
1. Работает ли это? Я не могу воспроизвести с предупреждениями и статусом выхода> 0
2. @daxim: Спасибо за добавление того, что у меня должно быть.
Ответ №3:
Для достижения такого поведения вы можете использовать $SIG{__WARN__}
для завершения работы после первого предупреждения. Точно так же:
package warncounter;
use strict;
use warnings;
my $warnings;
BEGIN {
$SIG{__WARN__} = sub {
$warnings ;
CORE::warn(@_);
exit(255);
};
}
1;
И затем вы можете запустить проверку синтаксиса как
perl -Mwarncounter -wc test.pl
Но тогда perl завершит работу сразу после первого предупреждения. Моей первой идеей было подсчитать количество предупреждений и установить статус выхода в конечном блоке, но в режиме проверки синтаксиса -c
конечный блок не вызывается.