【问题标题】:Printing a dot in Perl won't come on the screen till I print something else在我打印其他内容之前,在 Perl 中打印一个点不会出现在屏幕上
【发布时间】:2018-07-23 04:22:36
【问题描述】:

这听起来很疯狂,但是当我使用 printf(".") 行时,屏幕上什么也没有显示,直到我打印其他内容。当我打印出其他信息时,从一条简单的行返回到实际数据,所有备份的点都会打印出来。如果我使用printf(".\n"),那么它工作正常。

如果有影响的话,我会在 Ubuntu 系统上执行此操作。

谢谢

【问题讨论】:

  • 当没有格式说明符时不要使用printf。这不是 C,print 很好。

标签: perl


【解决方案1】:

这是一个缓冲问题。尝试设置自动刷新:$| = 1;

{
    $| = 1;
    print ".";
}
sleep 1 for 1..5;

STDOUT 是行缓冲的,所以print ".\n" 工作正常

更多信息:Suffering from buffering?

另一个有用的答案:Can you force-flush output in Perl?

【讨论】:

  • STDOUT->autoflush(1);
  • 为什么是sleep 1 for 1..5 而不是sleep 5
  • perldoc -f sleep ...在某些较旧的系统上,它可能会比您请求的睡眠时间少整整一秒,具体取决于它如何计算秒数。
  • 所以你更喜欢睡 0 到 5 秒而不是睡 4 到 5 秒?
  • 您可以添加验证并睡眠更多或跳过额外的秒数;)好的,下次我会用 sleep(5)
【解决方案2】:

正如其他人所说,这是一个缓冲问题。在最新的 Perl 版本中,您可以这样做:

 use IO::Handle
 STDOUT->autoflush()

我认为这比使用 $| 变量更干净,即使它会以相同的方式工作。

需要use IO::Handleautoflush 方法附加到任何将来的句柄。并且autoflush 有其怪癖,即在不传递值的情况下它假定1perlvar 手册页中所写:

每个方法都采用一个可选的 EXPR,如果提供了它,它将指定相关“IO::Handle”属性的新值。如果没有提供,大多数方法对当前值没有任何作用——除了“autoflush()”,它会为你假设一个 1,只是为了不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2014-03-20
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多