我在工作中使用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版本......有谁知道为什么会这样?如果有办法解决它呢?
答案 0 :(得分:4)
在大多数系统上,STDOUT
is line buffered表示print
和printf
只会在打印\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
。