2017-06-14 26 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();才能使用这些。)

相关问题