Tôi đang cố gắng đọc dữ liệu không được lọc từ một đường ống trong Perl. Ví dụ: trong chương trình bên dưới:Đọc dữ liệu chưa được lọc từ đường ống trong Perl
open FILE,"-|","iostat -dx 10 5";
$old=select FILE;
$|=1;
select $old;
$|=1;
foreach $i (<FILE>) {
print "GOT: $i\n";
}
iostat phun ra dữ liệu sau mỗi 10 giây (năm lần). Bạn mong đợi chương trình này sẽ làm như vậy. Tuy nhiên, thay vào đó nó xuất hiện để treo trong 50 giây (tức là 10x5), sau đó nó phun ra tất cả dữ liệu.
Làm thế nào tôi có thể nhận được trả lại bất kỳ dữ liệu nào có sẵn (theo cách thức không bị cản trở), mà không phải đợi tất cả các cách cho EOF?
P.S. Tôi đã thấy nhiều tài liệu tham khảo này dưới Windows - Tôi đang làm điều này dưới Linux.
Bạn nên sử dụng 'while' không phải là' foreach'. Và bộ đệm đầu ra của bạn là không quan trọng, cho rằng đó là một đầu vào xử lý không phải là một xử lý đầu ra. – tchrist
Sự khác biệt khi sử dụng trong khi và foreach là gì? – Jean
@alertjean: Trong 'foreach my $ i () {...}', đọc tệp được thực hiện trong ngữ cảnh danh sách, nghĩa là toàn bộ tệp được đọc trước khi các dòng được xử lý trong vòng lặp 'foreach'. Trong 'while (my $ i = ) {...}', việc đọc được thực hiện trong ngữ cảnh vô hướng, nghĩa là mỗi dòng được đọc và sau đó được xử lý trong khối trong khi trước khi đọc dòng kế tiếp. –