【发布时间】:2010-03-12 16:59:02
【问题描述】:
我在 perl 中有一个计算量很大的任务,并且想通过在每个计算部分完成后打印出一段时间来通知用户计算正在进行中。不幸的是,在我打印“\n”之前,我的任何句点都不会被打印出来。我该如何解决这个问题?
【问题讨论】:
我在 perl 中有一个计算量很大的任务,并且想通过在每个计算部分完成后打印出一段时间来通知用户计算正在进行中。不幸的是,在我打印“\n”之前,我的任何句点都不会被打印出来。我该如何解决这个问题?
【问题讨论】:
您需要为 STDOUT 设置自动刷新。示例:
use IO::Handle;
STDOUT->autoflush(1);
foreach (1..20) {
print '.';
sleep(1);
}
【讨论】:
在开始打印之前设置$|=1。例如。
perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }'
【讨论】:
STDOUT->autoflush(1) 与 $|=1 相同,但 $|=1 是全局的,STDOUT->autoflush(1) 特定于一个句柄。
use IO::Handle。并不是说IO::Handle 不是 eons 的标准模块,但是……是的。 :(`
你应该阅读的优秀文章:Suffering from Buffering?
【讨论】:
查看常见问题解答How do I flush/unbuffer an output filehandle? Why must I do this? 并注意:
除了
$|特殊变量之外,您还可以使用binmode为您的文件句柄提供:unix层,该层是无缓冲的...
对于一般问题,你可能想看看Time::Progress:
%b
%B进度条看起来像:
##############......................
【讨论】:
对我有用的是放线
STDOUT->autoflush(1);
在我的台词之前
print ".";
在我现有的循环中。没有使用睡眠,因为担心会更慢。
【讨论】: