Hãy xem xét kịch bản vô nghĩa sau đây là một ví dụ:Ngăn chặn perl từ in thông điệp cảnh báo giống hệt
use strict;
use warnings;
my $uninitialisedValue;
while(<>){
print ${$uninitialisedValue}{$_},"\n";
}
nào được chạy từ dòng lệnh:
$ perl warningPrinter.pl < longfile.txt
Bất kể những gì STDIN chứa, các STDOUT sẽ có đầy đủ:
Use of uninitialized value in print at warningPrinter.pl line 16, <> line 1.
Use of uninitialized value in print at warningPrinter.pl line 16, <> line 2.
Use of uninitialized value in print at warningPrinter.pl line 16, <> line 3.
Use of uninitialized value in print at warningPrinter.pl line 16, <> line 4.
...
Tôi làm việc với các tệp rất dài, vì vậy nhận được kết quả này khi xuất hiện ting kịch bản của tôi là ít nhất là kích thích nhẹ. Có thể mất một lúc để quy trình phản hồi tín hiệu chấm dứt CTRL-c và thiết bị đầu cuối của tôi đột nhiên được điền cùng thông báo lỗi.
Có cách nào nhận được perl để in chỉ là trường hợp đầu tiên của một thông điệp cảnh báo giống hệt nhau và tái xuất hiện hay chỉ làm cho thông điệp cảnh báo gây tử vong cho việc thực thi tập lệnh? Thấy như tôi chưa bao giờ sản xuất một kịch bản hoạt động mặc dù có cảnh báo trong họ, tôi cũng chấp nhận. Nhưng nó có lẽ thuận tiện hơn nếu tôi có thể nhận được perl để in cảnh báo giống hệt nhau chỉ một lần.
Hãy thử bài này StackOverflow khác: [Làm thế nào tôi có thể làm cho Perl chết nếu một cảnh báo được tạo ra?] [1] [1]: http://stackoverflow.com/questions/3896060/how- can-i-make-perl-die-if-a-cảnh báo-được tạo ra –
Tuyệt vời. 'sử dụng cảnh báo FATAL => 'all'' hoạt động rất tốt để giết chết quá trình này sau một cảnh báo trong trường hợp của tôi. – MattLBeck
Không sử dụng 'for' khi đọc tệp, đặc biệt khi tệp đó lớn, vì vòng lặp for sẽ tải trước danh sách của nó vào bộ nhớ. Sử dụng 'while' để thay thế. Ngoài ra, chuyển hướng một tập tin để stdin là dư thừa, chỉ cần sử dụng các tập tin như là đối số. Trong vấn đề cụ thể của bạn, mở lại STDERR cho một tập tin có thể là một giải pháp. – TLP