2010-03-12 6 views
14

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

17

Bạn cần đặt autoflush cho STDOUT. Ví dụ:

use IO::Handle; 
STDOUT->autoflush(1); 
foreach (1..20) { 
    print '.'; 
    sleep(1); 
} 
+2

@Hans Vui lòng không liên kết tới các bản sao sách trái phép. –

+0

Xem http://oreilly.com/catalog/9780596003135 và http://oreilly.com/catalog/9780596003135. –

+0

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. –

7

đặt $|=1 trước khi bạn bắt đầu in. Ví dụ.

perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }' 
+1

+1, vì ai đó đã đánh dấu giải pháp làm việc. –

+0

@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ý. –

+0

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. : (' –

0

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.