2017-06-14 30 views
-1

我正在寫另一個捕獲程序的輸出一個perl程序,我注意到,在一個while <FILEHANDLE>環(所以$_包含行讀),會出現以下情況:

open XIN, "-|", "test_xsr"; # not getting in real time! FIX 
while (<XIN>) { 
    print "."; 
} 

打印

.... 

後程序完成

open XIN, "-|", "test_xsr"; # not getting in real time! FIX 
while (<XIN>) { 
    print $_; 
} 

打印

1 
2 
3 
done 

實時在程序運行。 (雖然我正在測試,程序總是產生該輸出。)

爲什麼會出現這種不一致?
是否有可能實時處理輸出沒有print ing $_

+4

http://perl.plover.com/FAQs/Buffering.html – toolic

+0

我敢肯定,必須有一個規範的答案呃那麼說,但我找不到它。 – Sobrique

+0

這不是關於緩衝* input *文件句柄的行緩衝。這是關於你從'XIN'讀到的行最後換行的事實。 *令人震驚*,我知道。所以,當你打印它們時,輸出會被刷新。然而,如果你只是打印點,輸出坐在緩衝區中,直到它被填充。 –

回答

4

默認情況下,如果STDOUT連接到終端,則只有在遇到換行符或緩衝區已滿時刷新STDOUT。有一個換行符導致緩衝區在第二個片段中被刷新,但不在第一個片段中。

添加以下後print強制輸出被刷新:

STDOUT->flush(); 

以下內容添加到您的程序總是刷新寫入STDOUT後:

STDOUT->autoflush(); 

(舊版本Perl需要use IO::Handle qw();才能使用這些。)

相關問題