2014-11-21 34 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