【问题标题】:How to print before a while loop is started in Perl?如何在 Perl 中启动 while 循环之前打印?
【发布时间】: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


【解决方案1】:

输出是缓冲的,这意味着程序决定何时实际呈现您printed 的内容。你可以放

$| = 1;

在这个单一实例中刷新stdout。有关更多方法(自动刷新、文件刷新等),您可以在 SO 周围搜索有关此的问题。

【讨论】:

  • 尼特:$| = 1;影响select()返回的句柄,不一定是STDOUT。也就是说,select() 会返回 STDOUT,除非您另有说明。
【解决方案2】:

通常,perl 会在将输出文本刷新到设备之前缓冲多达 8KB 的输出文本,如果设备是终端,则缓冲到下一个换行符。您可以通过添加来避免这种情况

STDOUT->autoflush

到代码的顶部,假设您打印到STDOUT。这将强制在每次 printsaywrite 操作后刷新数据

请注意,这与使用 $| = 1 相同,但显着降低了神秘性,并允许您更改任何给定文件句柄的属性

【讨论】:

    【解决方案3】:

    您可以在之后立即刷新缓冲区来查看打印结果。

    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并搜索/\>\&/

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 2017-04-23
      • 1970-01-01
      • 2019-04-26
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多