установить состояние выхода, если perl -cw выдает предупреждение - PullRequest
5 голосов
/ 07 ноября 2011

Я бы хотел, чтобы 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. Я хотел бы иметь возможность обнаруживать, что были выданы предупреждения компиляции - предпочтительно с помощью настройки состояния выхода.

Ответы [ 3 ]

7 голосов
/ 07 ноября 2011

Установите обработчик предупреждений в блоке BEGIN (в верхней части скрипта, чтобы этот блок анализировался перед кодом, который может вызвать предупреждения во время компиляции), и настройте состояние выхода в ENDCHECK блок.

use strict;
use warnings;
my $warnings;
BEGIN {
    $SIG{__WARN__} = sub { $warnings++; CORE::warn @_ }
}
$used::only::once = 42;
CHECK {
    if ($^C && $warnings > 0) {
        exit $warnings;
    }
}

Переменная $^C имеет значение true, если и только если вы вызвали perl с параметром -c.

5 голосов
/ 07 ноября 2011

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

$ 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
2 голосов
/ 07 ноября 2011

Для достижения этого поведения вы можете использовать $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 выйдет сразу после первого предупреждения.Моей первой идеей было подсчитать количество предупреждений и установить состояние выхода в блоке END, но в режиме проверки синтаксиса -c Блок END не вызывается.

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