【问题标题】:Clear screen after output in Perl在 Perl 中输出后清除屏幕
【发布时间】:2012-03-10 16:10:38
【问题描述】:

我想在执行脚本后刷新输出,并且所有输出都不应该出现在我的终端屏幕中。

假设我有以下示例

#!/usr/bin/perl
print "HAI \n";
sleep 5;

如果我执行上面的脚本

# ./file
HAI
#

我希望上面的输出为

# ./file
#

HAI 应该显示 5 秒,它应该被删除,并且终端中不应该有像 putty 这样的输出。

【问题讨论】:

  • How flush file in perl? 的可能重复项
  • @J-16SDiZ 他的意思不是“刷新缓冲区”,他的意思是“清屏”。
  • 我认为您的意思不是“刷新”,因为它指的是缓冲区立即打印到屏幕上。您正在寻找一种方法来删除已打印的内容。
  • 好的,抱歉。我阅读了第一个答案,并认为这就是他想要做的。

标签: perl


【解决方案1】:

如前所述,只需设置 $|为真值将自动刷新您的结果。

当您说“HAI 应该显示 5 秒并且应该被删除并且终端中不应该有像 putty 这样的输出。”时,您实际上是在描述从屏幕上删除打印的文本。

为此,您需要使用特殊输出。请参阅 Term::ANSIScreen 了解一个可以帮助您做到这一点的 perl 模块。

这里有一些代码可以满足您的需求:

use strict;
use Term::ANSIScreen qw/:cursor :screen/;

$| = 1;

savepos;
print "HAI";
sleep 5;
loadpos;
clline();

【讨论】:

  • 这正是我想要的,感谢您的帮助
【解决方案2】:

此代码执行我认为您所追求的特定技巧:

$| = 1;       # set autoflush on STDOUT to avoid buffer problems
print "HAI "; # note no newline
sleep 5; 
print "\r      \n";'

\r 会将光标移回行首,然后覆盖之前写入的内容。

但这有点像 hack。您可能正在寻找类似Curses 的东西。

【讨论】:

    【解决方案3】:

    我用

     system("clear"); 
    

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      冲洗是什么意思

      由于已经有两个答案误解了您的问题,让我指出:perl(而不仅仅是)上下文中的“flush”一词意味着强制打印输出缓冲输出。要了解它的含义,请尝试类似

      for(1..60) {
      print "a";
      sleep(1);
      }
      print "\n";
      

      与您的预期相反,在 60 秒内您将没有输出,然后是 60 个字母 a。这是因为 perl 缓冲标准输出输出并仅在换行、文件关闭或缓冲区已满时发送。出于某种原因或其他原因,实际发送此缓冲区的操作称为刷新。

      设置 $|=1 ($| 有时称为 AUTOFLUSH 并且设置它意味着“在打印的每个字符上刷新标准输出缓冲区”)在这些操作之前,如上所述,会改变这种行为,但似乎与您的实际问题无关有。

      清屏

      一般没有办法清除输出。特别是,如果您将脚本重定向到文件,如

      perl myscript.pl > somefile.txt
      

      然后打印一些东西,不管你做什么,这个东西都会出现在 somefile.txt 中。

      当输出是屏幕或控制台时,有很多方法,但取决于它是哪种控制台。在许多情况下,按照 TLP 的建议发送 \r 即可。在其他情况下,您可以使用终端控制代码(由 curses 库包装)。

      但也有没有帮助的情况,例如我已经提到的那个(当你输出到文件时)或者当你使用一些不符合要求的控制台时(常见的情况是从一些文本编辑器运行脚本或IDE)。

      所以,总结一下:

      • 如果您确实需要回溯输出,请重新考虑您的设计,

      • 如果您正在为交互式脚本编写一些文本进度条或类似的东西,请使用 \r 或考虑移至 Curses 或 Term::Screen。或者查看更高级别的可用模块,例如 Term::ProgressBar

      【讨论】:

        【解决方案5】:

        $| 是控制刷新行为的变量。检查它here

        只需在 print 之前/之后添加这一行。

        $| = 1;
        

        如果您使用xterm,则字符序列\e[2J 用于清除整个终端窗口。你可以

        $| = 1;
        print "anything";
        sleep 5;
        print "\e[2J";
        

        对于其他终端,您可以查找对应的字符序列。

        【讨论】:

        • 在上面提到的那个很好,但我想删除脚本的所有行。但是上面的脚本只删除了一行。
        • 我知道了,我们可以通过调用函数 clup(); .无论如何,再次感谢每一个人。
        【解决方案6】:

        我知道了,我们可以通过调用函数 clup(); .无论如何,再次感谢每一个人

        use strict;
        use Term::ANSIScreen qw/:cursor :screen/;
        
        $| = 1;
        
        savepos;
        print "HAI";
        print "HAI";
        print "HAI";
        print "HAI";
        sleep 2;
        loadpos;
        clup();
        

        这对我有用:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-04
          • 2011-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-01
          • 1970-01-01
          相关资源
          最近更新 更多