2014-11-21 32 views
0

我在程序中有很多日誌記錄,它們是打印和警告消息的混合。問題在於輸出與程序流程不同步,因此即使打印的消息在程序流程中首先出現,在打印的消息之前有時會彈出警告。我想這與打印到STDOUT並向STDERR發出警告的事實有關,並且兩者在它們出現在屏幕上之前都被緩衝。如何在Perl中同步打印和警告語句?

這個小例子演示效果:

for(my $i=0;$i<1000;$i++) { 
    print "++++++++++++++++++++++++++ $i\n"; 
    warn "------------------------- $i\n"; 
} 

你沒有得到交替+++和---線,但它們的集羣混合。

我在這裏讀到的地方有一些可以用Perl中的緩衝區做的奇特事情,但我不記得它是什麼。所以我的問題是,如何在上面的代碼中交替使用+++和---行(保留警告和打印)?

編輯:我在這裏擡頭另一個問題以及與此(感謝mpapec)用於自動沖洗上來:

use IO::Handle; 
STDOUT->autoflush(); 
STDERR->autoflush(); 
for(my $i=0;$i<1000;$i++) { 
    STDOUT->printflush("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ $i\n"); 
    STDERR->printflush("------------------------------------------------------------ $i\n"); 
} 

現在這一個產生交變2條+++和兩個---線。仍然不是理想的結果。此外,它顯然不使用打印和警告,因此會迫使我改變很多代碼行。

回答

1
use IO::Handle; 

STDOUT->autoflush(); 
STDERR->autoflush(); 

,並嘗試與warn在該行的末尾\n換行符。

+0

Thx,但不適合我。即使添加了新行。產生的效果與之前不一樣,但輸出非常相似。仍然是打印和警告線的羣集。 – jackthehipster 2014-11-21 10:44:18

+0

是的,它又一次看起來有些不同(更大的羣集),但仍然不如預期。 – jackthehipster 2014-11-21 10:54:56

+0

奇怪。將在另一個系統上嘗試。我在Windows/Eclipse/Strawberry下試過了。 – jackthehipster 2014-11-21 12:00:00