Perl:打印回到行首

时间:2010-05-05 15:30:37

标签: perl command-line

好的,所以我要做的就是在我的命令行打印一个完整的百分比,现在,我希望这只是“更新”屏幕上显示的数字。所以不知何故回到行的开头并改变它。

例如,windows relog.exe命令行实用程序(可以将.blg文件转换为.csv文件)执行此操作。如果您运行它,它将显示完成百分比。

现在这可能是用C ++编写的。 我不知道perl中是否可能这样做?

4 个答案:

答案 0 :(得分:14)

使用“\ r”或“\ 015”八进制(又名“返回插入符号”又名“Carriage Return”字符来源于打字机日:)

> perl5.8 -e 'print "11111\r222\r3\n";'
32211
> perl5.8 -e 'print "11111\015222\0153\n";'  
32211

只是不要忘记打印至少与已经打印的最长字符串一样多的字符来覆盖任何旧字符(正如您在上面的例子中看到的那样,如果不这样做将保留旧字符)。

另一件需要注意的事情是,正如迈克尔在文章中指出的那样,在这些打印发生时需要打开autoflush,这样输出就不会在处理结束时等待换行符。 / p>

更新:请注意,在另一个答案中推荐的013八进制字符实际上是一个垂直标签:

> perl5.8 -e 'print "11111\013222\0133\n";'    
11111
     222
        3

答案 1 :(得分:8)

根据您的要求,pv可能会解决您的问题。它可以包装任何以文件作为输入的脚本,并添加进度条。

例如

pv data.gz | gunzip -c | ./complicated-perl-script-that-reads-stdin

pv至少为RedHat / CentOS和Ubuntu打包。更多信息:http://www.ivarch.com/programs/pv.shtml

否则我会使用CPAN,例如Term::ProgressBar

答案 2 :(得分:1)

您也可以使用\ b移回一个字符:

local $| = 1; #flush immediately
print "Doing it - 10%";
sleep(1);
print "\b\b\b";
print "20%";
print "\n", "Done", "\n";

答案 3 :(得分:0)

在C和C ++中,诀窍是打印char#13。也许它可以在Perl中运行。

for (int pc = 0 ; pc <= 100 ; ++pc)
    printf("Percentage: %02d %%  %c", pc, 13);
printf("\n");