print \ r \ n语句不会在同一行上更新

时间:2015-09-24 00:41:54

标签: perl

我在工作中使用Activestate Perl(不要讨厌我)。

我曾经有过这个我曾经常用的小子。这是一个倒计时睡眠,并且会在同一行上执行时显示屏幕上的倒计时,而不是新行。

下面,

sub countdownsleep {
    my $prefix = shift;
    my $x = shift;
    my $t = 1 *$x;
    my ($m,$s);
     my $stoptime = time + $t;
     while((my $now = time) < $stoptime) {
       printf( "$prefix %02d:%02d\r", ($stoptime - $now) / 60, ($stoptime - $now) % 60);
       $m = ($stoptime - $now) / 60;
       $s = ($stoptime - $now) % 60;
       select(undef,undef,undef,1);
     }
}

countdownsleep("Sleep... ",5);

输出如下:

Sleep... <5..0>  # on the same line on the same spot.

它曾用于以前的perl版本......有谁知道为什么会这样?如果有办法解决它呢?

1 个答案:

答案 0 :(得分:4)

在大多数系统上,STDOUT is line buffered表示printprintf只会在打印\n后显示。因此,如果您尝试在STDOUT上执行此倒计时,则在程序结束之前不会打印任何内容。

您可以使用local $| = 1暂时关闭当前选定的文件句柄。

while((my $now = time) < $stoptime) {
    local $| = 1;
    printf( "$prefix %02d:%02d\r", ($stoptime - $now) / 60, ($stoptime - $now) % 60);
    sleep 1;
}

旁注:select(undef,undef,undef,1);是一种模糊的写作方式sleep 1