入力ファイルが見つからない場合、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は同じですが、continueブロックはありません。)

<>空のオペレータはに相当し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はありません。とった。
Mark Reed

4

ループの本体にフラグを設定し、ワンライナーの最後にあるENDブロックのフラグを確認します。

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

また、すべてのファイルがゼロ以外の長さであると想定しています。
Tanktalus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.