нужен Perl, чтобы умереть, когда неявное открытие не удается - PullRequest
5 голосов
/ 18 октября 2019

Я пытаюсь перенести сценарий sed в однострочную версию perl, потому что perl поддерживает не жадное регулярное выражение. Я получил советы от Не жадного (неохотного) сопоставления регулярных выражений в sed? и Почему мой сценарий Perl на месте завершает работу с нулевым кодом выхода, даже если он не работает?

Мне нужен мой oneliner для выхода с ненулевым статусом, если не удалось открыть файл.

К сожалению, проверка -f $ARGV[0] ненадежна, поскольку файл может существовать и все еще быть недоступным.

Одна из идей - добавить некоторый perl-код для выполнения между всеми файлами в командной строке, но я не могу его найти. END выполняется один раз, и если последний файл завершился успешно, он не будет знать, что предыдущие файлы не удалось.

touch aaa.txt
chmod 000 aaa.txt
perl -i -pe 'BEGIN { -f $ARGV[0] or die "fatal: " . $!; }' aaa.txt; echo $?

_

Can't open aaa.txt: Permission denied.
0

1 Ответ

7 голосов
/ 18 октября 2019

Текст Can't open ... является предупреждением. Вы можете перехватить это, используя обработчик сигнала $SIG{__WARN__}.

Поскольку вы должны получать только предупреждения от неявного оператора <> в цикле, предоставляемого переключателем -p, вы можете переписать свой код следующим образом:

perl -i -pe 'BEGIN { $exit = 0; $SIG{__WARN__} = sub { $exit = 1; warn @_} } END { $? = $exit}' aaa.txt; echo $?

Это устанавливает$exit в 0 в начале скрипта и устанавливает его в 1, если есть предупреждение. Блок END присваивает значение $exit $?, которое будет кодом завершения скрипта после его завершения.

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