$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Мені б дуже хотілося, щоб сценарій perl вийшов з ладу, коли файл не існує. Який "правильний" спосіб зробити -p або -n провалом, коли вхідного файлу не існує?
$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Мені б дуже хотілося, щоб сценарій perl вийшов з ладу, коли файл не існує. Який "правильний" спосіб зробити -p або -n провалом, коли вхідного файлу не існує?
Відповіді:
Ключ -p це просто ярлик для упаковки вашого коду (аргумент наступного -e) в цьому циклі:
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
(-n те саме, але без блоку продовження.)
<>
Порожній оператор еквівалентний readline *ARGV
, і який відкриває кожен аргумент в послідовності у вигляді файлу на читання. Немає способів вплинути на обробку помилок цього неявного відкритого, але ви можете зробити попередження, яке воно видає фатальне (зауважте, це також вплине на кілька попереджень, пов’язаних із перемикачем -i):
perl -Mwarnings=FATAL,inplace -pe 1 foo && echo ok
The presence of the word "FATAL" in the category list will escalate warnings in those categories into fatal errors in that lexical scope.
inplace
це категорія; без цього -Mwarnings=FATAL
означає FATAL => all
, чого ми не хочемо. зрозумів.
Встановіть прапор у тілі циклу, перевірте прапор у блоці END у кінці oneliner.
perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2
Зауважте, що він не працює, лише якщо файл не оброблявся.
Щоб повідомити про проблему, коли не знайдено всіх файлів, ви можете використовувати щось на зразок
perl -pe 'BEGIN{ $files = @ARGV} $found++ if eof; ... ;END {die "Some files not found" unless $files == $found}'
BEGIN{die "File not found" unless -f $ARGV[0]}
. (Я кажу легше, тому що це не передбачає встановлення прапора та додавання 2-х штук кодів)