Як найкраще (ідіоматично) відмовити скрипт perl (запустити з -n / -p), коли вхідний файл не знайдено?


11
$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok

Мені б дуже хотілося, щоб сценарій perl вийшов з ладу, коли файл не існує. Який "правильний" спосіб зробити -p або -n провалом, коли вхідного файлу не існує?

Відповіді:


6

Ключ -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

@MarkReed inplace - це категорія попереджень, яка нас цікавить. Немає причин впливати на інші попередження.
Грінц

З попереджень :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, чого ми не хочемо. зрозумів.
Марк Рід

4

Встановіть прапор у тілі циклу, перевірте прапор у блоці 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}'

1
Якщо ваш сценарій повинен приймати файли як аргументи, а не читати зі stdin, легшою альтернативою цього рішення буде BEGIN{die "File not found" unless -f $ARGV[0]}. (Я кажу легше, тому що це не передбачає встановлення прапора та додавання 2-х штук кодів)
Dada

Також передбачається, що всі файли мають ненульову довжину.
Танкталус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.