我的程序(碰巧是在Perl中,尽管我不认为这个问题是Perl特有的)在程序的某一点以Progress: x/yy形式输出状态消息,其中xyy是数字,例如:Progress: 4/38

在打印新的状态消息时,我想“覆盖”先前的输出,这样我就不会在屏幕上显示状态消息了。到目前为止,我已经尝试过了:

my $progressString = "Progress\t$counter / " . $total . "\n";
print $progressString;
#do lots of processing, update $counter
my $i = 0;
while ($i < length($progressString)) {
    print "\b";
    ++$i;
}

如果我在$progressString中包含换行符,则不会打印退格字符。但是,如果我不使用换行符,则输出缓冲区将永远不会刷新,并且不会输出任何内容。

有什么好的解决方案?

最佳答案

将自动刷新与STDOUT一起使用:

local $| = 1; # Or use IO::Handle; STDOUT->autoflush;

print 'Progress: ';
my $progressString;
while ...
{
  # remove prev progress
  print "\b" x length($progressString) if defined $progressString;
  # do lots of processing, update $counter
  $progressString = "$counter / $total"; # No more newline
  print $progressString; # Will print, because auto-flush is on
  # end of processing
}
print "\n"; # Don't forget the trailing newline

关于perl - 更新命令行输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5009258/

10-11 15:45