【发布时间】:2018-07-01 20:28:44
【问题描述】:
我在Perl中有这个代码:
print "Processing ... ";
while ( some condition ) {
# do something over than 10 minutes
}
print "OK\n";
现在我在 while 循环结束后返回第一个打印。
如何在 while 循环开始之前在打印消息?
【问题讨论】:
标签: perl printing while-loop
我在Perl中有这个代码:
print "Processing ... ";
while ( some condition ) {
# do something over than 10 minutes
}
print "OK\n";
现在我在 while 循环结束后返回第一个打印。
如何在 while 循环开始之前在打印消息?
【问题讨论】:
标签: perl printing while-loop
输出是缓冲的,这意味着程序决定何时实际呈现您printed 的内容。你可以放
$| = 1;
在这个单一实例中刷新stdout。有关更多方法(自动刷新、文件刷新等),您可以在 SO 周围搜索有关此的问题。
【讨论】:
$| = 1;影响select()返回的句柄,不一定是STDOUT。也就是说,select() 会返回 STDOUT,除非您另有说明。
通常,perl 会在将输出文本刷新到设备之前缓冲多达 8KB 的输出文本,如果设备是终端,则缓冲到下一个换行符。您可以通过添加来避免这种情况
STDOUT->autoflush
到代码的顶部,假设您打印到STDOUT。这将强制在每次 print、say 或 write 操作后刷新数据
请注意,这与使用 $| = 1 相同,但显着降低了神秘性,并允许您更改任何给定文件句柄的属性
【讨论】:
您可以在之后立即刷新缓冲区来查看打印结果。
print "Processing ... ";
STDOUT->flush;
如果您使用autoflush,您应该通过复制文件句柄来保存当前配置。
use autodie; # dies if error on open and close.
{
STDOUT->flush; # empty its buffer
open my $saved_stdout, '>&', \*STDOUT;
STDOUT->autoflush;
# ... output with autoflush active
open STDOUT, '>&', $saved_stdout; # restore old STDOUT
}
查看perldoc -f open并搜索/\>\&/
【讨论】: