【问题标题】:Perl: print back to beginning of linePerl:打印回到行首
【发布时间】:2010-05-05 15:30:36
【问题描述】:

好的,所以我正在尝试将完成的百分比打印到我的命令行,现在,我希望这只是“更新”屏幕上显示的数字。所以以某种方式回到行首并更改它。

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

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

【问题讨论】:

    标签: perl command-line


    【解决方案1】:

    使用八进制“\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
    

    【讨论】:

    • 有关可以打印的特殊字符的完整列表,请参阅en.wikipedia.org/wiki/ASCII
    • 您还需要打开自动刷新 ($| = 1),因为默认情况下输出会被缓冲,直到看到换行符。 (或者直到缓冲区已满,但进度表不会发生这种情况。)
    • @Michael - 我的原始答案包括自动刷新,我将其删除以降低行长,因为严格来说它与问题的实质无关......添加为注释
    • @DVK FWIW 其他答案没有建议八进制 13,它建议 十进制 13,实际上是 \r (\x0d)。
    • 另外请注意,垂直制表符并不是每个 shell 都可以识别的。 :)
    【解决方案2】:

    根据您的需要,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.

    【讨论】:

    • @rjh - 我感觉他在 Windows 上,所以他可能需要一个 DOS/Windows pv 端口
    • +1 用于 CPAN 模块 - 我不确定它对 OP 有多大用处,但了解它很有教育意义
    【解决方案3】:

    您也可以使用 \b 向后移动一个字符:

    本地 $| = 1; #立即刷新 打印“做它 - 10%”; 睡眠(1); 打印“\b\b\b”; 打印“20%”; 打印“\n”、“完成”、“\n”;

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 2015-11-03
        • 2023-01-10
        • 2016-06-13
        • 1970-01-01
        • 2014-03-31
        • 2014-07-22
        相关资源
        最近更新 更多