Làm thế nào tốt nhất (thành ngữ) để thất bại tập lệnh perl (chạy với -n / -p) khi không tìm thấy tệp đầu vào?


11
$ 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:


6

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

@MarkReed inplace là danh mục cảnh báo mà chúng tôi quan tâm. Không có lý do gì để ảnh hưởng đến các cảnh báo khác.
Grinnz

Từ các cảnh báo :The presence of the word "FATAL" in the category list will escalate warnings in those categories into fatal errors in that lexical scope.
Grinnz

Phải, inplacelà phạm trù; không có nó, -Mwarnings=FATALcó nghĩa là FATAL => all, mà chúng ta không muốn. hiểu rồi.
Mark Reed

4

Đặ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}'

1
Nếu tập lệnh của bạn được coi là lấy các tệp làm đối số thay vì đọc từ stdin, một giải pháp thay thế nhẹ hơn cho giải pháp này sẽ là 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ã)
Dada

Cũng giả sử tất cả các tệp có độ dài khác không.
Tanktalus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.