【发布时间】:2010-05-05 15:30:36
【问题描述】:
好的,所以我正在尝试将完成的百分比打印到我的命令行,现在,我希望这只是“更新”屏幕上显示的数字。所以以某种方式回到行首并更改它。
例如,Windows relog.exe 命令行实用程序(可以将 .blg 文件转换为 .csv 文件)执行此操作。如果您运行它,它将显示完成百分比。
现在这可能是用 C++ 编写的。 我不知道这在 perl 中是否也是可能的?
【问题讨论】:
标签: perl command-line
好的,所以我正在尝试将完成的百分比打印到我的命令行,现在,我希望这只是“更新”屏幕上显示的数字。所以以某种方式回到行首并更改它。
例如,Windows relog.exe 命令行实用程序(可以将 .blg 文件转换为 .csv 文件)执行此操作。如果您运行它,它将显示完成百分比。
现在这可能是用 C++ 编写的。 我不知道这在 perl 中是否也是可能的?
【问题讨论】:
标签: perl command-line
使用八进制“\r”或“\015”(又名“回车符”又名“Carriage Return”字符,源自打字机时代:)
> perl5.8 -e 'print "11111\r222\r3\n";'
32211
> perl5.8 -e 'print "11111\015222\0153\n";'
32211
不要忘记打印至少与已打印的最长字符串一样多的字符以覆盖任何旧字符(如您在上面的示例中所见,不这样做将保留旧字符)。
另一件需要注意的是,正如迈克尔在评论中指出的那样,在这些打印发生时需要打开自动刷新,这样输出就不会在处理结束时等待换行符。
更新:请注意,另一个答案中推荐的 013 八进制字符实际上是一个垂直制表符:
> perl5.8 -e 'print "11111\013222\0133\n";'
11111
222
3
【讨论】:
$| = 1),因为默认情况下输出会被缓冲,直到看到换行符。 (或者直到缓冲区已满,但进度表不会发生这种情况。)
\r (\x0d)。
根据您的需要,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.
【讨论】:
您也可以使用 \b 向后移动一个字符:
本地 $| = 1; #立即刷新 打印“做它 - 10%”; 睡眠(1); 打印“\b\b\b”; 打印“20%”; 打印“\n”、“完成”、“\n”;【讨论】:
在 C 和 C++ 中,诀窍是打印 char #13。也许它可以在 Perl 中工作。
for (int pc = 0 ; pc <= 100 ; ++pc)
printf("Percentage: %02d %% %c", pc, 13);
printf("\n");
【讨论】: