在Perl中输出后清除屏幕

在Perl中输出后清除屏幕,perl,Perl,我希望在执行脚本后刷新输出,并且所有输出都不应出现在我的终端屏幕中 假设我有一个下面的例子 #!/usr/bin/perl print "HAI \n"; sleep 5; 如果我执行上面的脚本 # ./file HAI # 我想把上面的输出作为 # ./file # HAI应显示5秒钟,并应将其删除,且终端中不应出现类似油灰的输出 $|是控制刷新行为的变量。检查一下 只需在打印之前/之后添加这一行即可 $| = 1; 如果使用的是xterm,则字符序列\e[2J用于清除整个终端窗口。您

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

假设我有一个下面的例子

#!/usr/bin/perl
print "HAI \n";
sleep 5;
如果我执行上面的脚本

# ./file
HAI
#
我想把上面的输出作为

# ./file
#

HAI应显示5秒钟,并应将其删除,且终端中不应出现类似油灰的输出

$|
是控制刷新行为的变量。检查一下

只需在
打印之前/之后添加这一行即可

$| = 1;
如果使用的是
xterm
,则字符序列
\e[2J
用于清除整个终端窗口。您可以

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

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

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

只需在
打印之前/之后添加这一行即可

$| = 1;
如果使用的是
xterm
,则字符序列
\e[2J
用于清除整个终端窗口。您可以

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

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

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

$| = 1;       # set autoflush on STDOUT to avoid buffer problems
print "HAI "; # note no newline
sleep 5; 
print "\r      \n";'
\r
将光标移回行首,然后覆盖先前写入的内容


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

此代码执行我认为您需要的特定技巧:

$| = 1;       # set autoflush on STDOUT to avoid buffer problems
print "HAI "; # note no newline
sleep 5; 
print "\r      \n";'
\r
将光标移回行首,然后覆盖先前写入的内容


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

如前所述,只需将$|设置为真实值,即可自动刷新结果

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

要做到这一点,您需要使用特殊的输出。请参阅Term::AnisScreen以了解一个perl模块,该模块将帮助您实现这一点

下面是一些代码,可以实现您要查找的功能:

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

$| = 1;

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

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

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

要做到这一点,您需要使用特殊的输出。请参阅Term::AnisScreen以了解一个perl模块,该模块将帮助您实现这一点

下面是一些代码,可以实现您要查找的功能:

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

$| = 1;

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

冲水是什么意思

由于已经有两个答案不理解您的问题,让我指出:perl(不仅仅是perl)上下文中的“flush”一词意味着强制打印缓冲输出

for(1..60) {
print "a";
sleep(1);
}
print "\n";
与您可能期望的相反,在60秒钟内,您将不会得到任何输出,然后是60个字母a。这是因为perl缓冲标准输出,并仅在换行、文件关闭或缓冲区已满时发送它。出于某种原因,实际发送此缓冲区的操作称为刷新

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

清除屏幕

一般来说,没有办法清除输出

perl myscript.pl > somefile.txt
然后打印一些东西,不管你做什么,这些东西都会放到somefile.txt中

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

但也有一些情况下,它不会有帮助,例如我已经提到的一个(当您输出到文件时),或者当您使用一些不一致的控制台时(常见的情况是从一些文本编辑器或IDE运行脚本)

因此,总结一下:

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

  • >P>如果你正在编写一些类似于交互式脚本的文本进度条或类似的东西,请使用\ R或考虑移动到诅咒或可能。或者检查更高级别的可用模块,如


      冲洗是什么意思

      由于已经有两个答案不理解您的问题,让我指出:perl(不仅仅是perl)上下文中的“flush”一词意味着强制打印缓冲输出

      for(1..60) {
      print "a";
      sleep(1);
      }
      print "\n";
      
      与您可能期望的相反,在60秒钟内,您将不会得到任何输出,然后是60个字母a。这是因为perl缓冲标准输出,并仅在换行、文件关闭或缓冲区已满时发送它。出于某种原因,实际发送此缓冲区的操作称为刷新

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

      清除屏幕

      一般来说,没有办法清除输出

      perl myscript.pl > somefile.txt
      
      然后打印一些东西,不管你做什么,这些东西都会放到somefile.txt中

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

      但也会有一些情况下,它不会有帮助,例如我已经提到的一个(当您输出到文件时),或者当您使用一些不一致的控制台时(常见情况)