2013-07-29 21 views
1

我喜欢让我的脚本将执行进度报告打印出来,以便我可以判断它们是否正在运行以及需要等待多长时间。但perl似乎在最后打印所有输出,而不是在执行命令。例如,该程序会等待10秒钟,然后在打印“pauseafterpause之前”在同一时间:Perl:如何在执行期间获得实时更新

print("before pause"); 
sleep 10; 
print("after pause"); 

我也曾尝试用相同的结果:

my $filename="out"; 
open(OUT, ">>$filename"); 
print OUT "before pause"; 
sleep 10; 
print OUT "after pause"; 

出现这种情况我是否” m本地运行或提交给群集。

我知道这可以通过运行其他人写的perl脚本来实现;但通过查看他们的代码,我不知道他们是如何做的。任何人都可以启发我吗?谢谢!

+1

你是“苦于缓冲” - http://www.plover.com/FAQs/Buffering.html –

回答

5

Perl缓冲您的输出效率。如果你的终端是print,那么输出是行缓冲的。结束与一个换行的信息,以把它立即显示:

print "before\n"; 
sleep 3; 
print "after\n"; 

如果您的输出被重定向(到一个文件或管道),则使用块缓冲,因为这是更有效的。这通常是好的(除非你是文件)。如果没有,你可以在你想无缓冲手柄手柄(默认为STDOUT)当前选择关闭缓冲,由$|变量设置为1

local $| = 1; 
print "before"; 
sleep 3; 
print "after"; 

但genenerally,你应该使用IO: :处理方法:

$some_handle->autoflush(1); 
...; 

(见ikegami的回答)。

STDERR输出句柄旨在用于错误或任何其他不是程序主要输出的输出。它默认没有缓冲,非常适合打印进度报告。这也适用:

print STDERR "before"; 
sleep 3; 
print STDERR "after"; 
3

首先,无故停止使用全局变量。并至少添加一个简单的检查,以确定open是否成功。

open(my $OUT, ">>", $filename) or die $!; 

您只需关闭缓冲

use IO::Handle; # Only needed for older versions of Perl 
$OUT->autoflush(1); 

然后你就可以打印正常。

print $OUT "text\n"; 
相关问题