$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Saya benar-benar ingin skrip perl gagal saat file tidak ada. Apa cara "tepat" untuk membuat -p atau -n gagal ketika file input tidak ada?
$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Saya benar-benar ingin skrip perl gagal saat file tidak ada. Apa cara "tepat" untuk membuat -p atau -n gagal ketika file input tidak ada?
Jawaban:
The beralih p hanya jalan pintas untuk membungkus kode Anda (argumen berikut -e) dalam lingkaran ini:
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
(-n adalah sama tetapi tanpa melanjutkan blok.)
The <>
Operator kosong setara dengan readline *ARGV
, dan yang terbuka setiap argumen dalam suksesi sebagai file untuk membaca dari. Tidak ada cara untuk memengaruhi penanganan kesalahan dari implisit yang terbuka, tetapi Anda dapat membuat peringatan yang dipancarkannya fatal (catatan, ini juga akan memengaruhi beberapa peringatan terkait dengan -i switch):
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
kategorinya; tanpanya, -Mwarnings=FATAL
berarti FATAL => all
, yang tidak kita inginkan. oke.
Atur bendera di badan loop, periksa bendera di blok END di akhir oneliner.
perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2
Perhatikan bahwa itu hanya gagal ketika tidak ada file yang diproses.
Untuk melaporkan masalah ketika tidak semua file ditemukan, Anda dapat menggunakan sesuatu seperti
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]}
. (Saya katakan lebih ringan, karena tidak melibatkan pengaturan bendera dan menambahkan 2 buah kode)