【问题标题】:How can I print text immediately without waiting for a newline in Perl?如何在不等待 Perl 换行符的情况下立即打印文本?
【发布时间】:2010-03-12 16:59:02
【问题描述】:

我在 perl 中有一个计算量很大的任务,并且想通过在每个计算部分完成后打印出一段时间来通知用户计算正在进行中。不幸的是,在我打印“\n”之前,我的任何句点都不会被打印出来。我该如何解决这个问题?

【问题讨论】:

    标签: perl printing newline


    【解决方案1】:

    您需要为 STDOUT 设置自动刷新。示例:

    use IO::Handle;
    STDOUT->autoflush(1);
    foreach (1..20) {
      print '.';
      sleep(1);
    }
    

    【讨论】:

    【解决方案2】:

    在开始打印之前设置$|=1。例如。

    perl -e ' $|=1; foreach (1..10) { print "$_ "; sleep(1); }'
    

    【讨论】:

    • @ar, STDOUT->autoflush(1)$|=1 相同,但 $|=1 是全局的,STDOUT->autoflush(1) 特定于一个句柄。
    • 除非你必须做一个use IO::Handle。并不是说IO::Handle 不是 eons 的标准模块,但是……是的。 :(`
    【解决方案3】:

    你应该阅读的优秀文章:Suffering from Buffering?

    【讨论】:

      【解决方案4】:

      查看常见问题解答How do I flush/unbuffer an output filehandle? Why must I do this? 并注意:

      除了$| 特殊变量之外,您还可以使用binmode 为您的文件句柄提供:unix 层,该层是无缓冲的...

      对于一般问题,你可能想看看Time::Progress

      %b

      %B

      进度条看起来像:

      ##############......................
      

      【讨论】:

        【解决方案5】:

        对我有用的是放线

        STDOUT->autoflush(1);
        

        在我的台词之前

        print ".";
        

        在我现有的循环中。没有使用睡眠,因为担心会更慢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          • 2010-12-12
          • 1970-01-01
          • 2019-02-01
          相关资源
          最近更新 更多