Tôi có một nhiệm vụ tốn kém về tính toán trong perl và muốn thông báo cho người dùng rằng tính toán đang diễn ra bằng cách in ra một khoảng thời gian sau khi mỗi phần của tính toán được hoàn thành. Thật không may, cho đến khi tôi in một "\ n", không có khoảng thời gian nào của tôi được in. Làm thế nào tôi có thể giải quyết vấn đề này?Làm cách nào để in văn bản ngay lập tức mà không cần đợi dòng mới trong Perl?
Trả lời
Bạn cần đặt autoflush cho STDOUT. Ví dụ:
use IO::Handle;
STDOUT->autoflush(1);
foreach (1..20) {
print '.';
sleep(1);
}
đặt $|=1
trước khi bạn bắt đầu in. Ví dụ.
perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }'
+1, vì ai đó đã đánh dấu giải pháp làm việc. –
@ar, 'STDOUT-> autoflush (1)' cũng giống như '$ | = 1' ngoại trừ' $ | = 1', là toàn cầu và 'STDOUT-> autoflush (1)' là cụ thể cho một xử lý. –
Trừ khi bạn phải thực hiện 'sử dụng IO :: Xử lý'. Không phải là 'IO :: Xử lý' không phải là một mô-đun chuẩn cho eons, nhưng ... yeah. : (' –
Xem FAQ How do I flush/unbuffer an output filehandle? Why must I do this? và lưu ý:
Bên cạnh
$|
biến đặc biệt, bạn có thể sử dụng để cung cấp chobinmode
filehandle của bạn một lớp:unix
, đó là không có bộ đệm ...
Đối với vấn đề chung, bạn có thể muốn xem Time::Progress:
%b
%B
thanh tiến trình trông giống như:
##############......................
Một bài viết tuyệt vời bạn nên đọc: Suffering from Buffering?
gì làm việc cho tôi là đưa dòng
STDOUT->autoflush(1);
trước dòng
print ".";
của tôi bên trong vòng lặp hiện tại của tôi. Không sử dụng giấc ngủ vì sợ làm chậm nhiều thứ hơn nữa.
@Hans Vui lòng không liên kết tới các bản sao sách trái phép. –
Xem http://oreilly.com/catalog/9780596003135 và http://oreilly.com/catalog/9780596003135. –
Xin lỗi, nó chỉ xuất hiện khi Tôi đã tìm kiếm trên web. Bây giờ, hãy xóa liên kết. –