$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Tôi thực sự muốn tập lệnh perl bị lỗi khi tập tin không tồn tại. Cách "thích hợp" để tạo -p hoặc -n không thành công khi tệp đầu vào không tồn tại?
$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok
Tôi thực sự muốn tập lệnh perl bị lỗi khi tập tin không tồn tại. Cách "thích hợp" để tạo -p hoặc -n không thành công khi tệp đầu vào không tồn tại?
Câu trả lời:
Công tắc -p chỉ là một phím tắt để gói mã của bạn (đối số sau -e) trong vòng lặp này:
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
(-n là như nhau nhưng không có khối tiếp tục.)
Các <>
nhà khai thác có sản phẩm nào tương đương với readline *ARGV
, và mở ra mỗi đối số liên tiếp như một tập tin để đọc từ. Không có cách nào để tác động đến việc xử lý lỗi của việc mở ngầm định đó, nhưng bạn có thể đưa ra cảnh báo mà nó phát ra gây tử vong (lưu ý, điều này cũng sẽ ảnh hưởng đến một số cảnh báo liên quan đến công tắc -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
là phạm trù; không có nó, -Mwarnings=FATAL
có nghĩa là FATAL => all
, mà chúng ta không muốn. hiểu rồi.
Đặt cờ trong phần thân của vòng lặp, kiểm tra cờ trong khối END ở cuối oneliner.
perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2
Lưu ý rằng nó chỉ thất bại khi không có tập tin được xử lý.
Để báo cáo sự cố khi không tìm thấy tất cả các tệp, bạn có thể sử dụng một cái gì đó như
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]}
. (Tôi nói nhẹ hơn, vì nó không liên quan đến việc đặt cờ và thêm 2 đoạn mã)