我使用Ubuntu 12.04从bash中的perl脚本打印进度。当我使用它时:
foreach my $filename (sort @files) {
print "Processing $filename...\n";
它打印每个进度线,每个打印之间的间隙约为2秒,这很好。但是有一些好文件,所以它很吵。我试着改用它:
print "\rProcessing $filename...";
但是现在我没有输出任何输出,直到脚本到达最后一个文件,然后这是我看到的唯一打印语句(最后一个)。顺便说一下,我并不关心删除之前打印的语句,因为每个语句的长度都完全相同。
但是,我可以在bash中执行seq 1 1000000 | while read i; do echo -en "\r$i"; done
并且它可以正常工作。
答案 0 :(得分:3)
您可以在perl脚本中尝试无缓冲输出,
$| = 1;
答案 1 :(得分:2)
您是Suffering from Buffering 。所提供的链接将带您阅读大约1998年由Perc Journal撰写的优秀文章,来自Marc Jason Dominus(高阶Perl的作者)。这篇文章可能已有十多年的历史了,但今天的主题和他写这篇文章的时候一样重要。
mpapec提出了$| = 1;
技术。我想补充一点,在Perl社区的主要思想中,似乎$| = 1
优于$|++
,因为它的含义更清晰。我知道,自动增量也非常简单,但是当应用$|
或++
时,每个看过代码的人都会知道--
的行为(没有查找)在perlvar)。我碰巧也喜欢本地化Perl"特殊变量的任何修改"因此,效果不会消失到代码的其他部分,这些部分可能对默认Perl行为的特定更改不起作用。