установите статус выхода, если perl -cw выдает предупреждение

#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 конечный блок не вызывается.