2012-02-20 72 views
1

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

说我有一个下面的例子

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

如果我执行上面的脚本

# ./file 
HAI 
# 

我想有上述输出

# ./file 
# 

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

+0

可能重复[如何刷新perl文件?](http://stackoverflow.com/questions/4538767/how-flush-file-in-perl) – 2012-02-20 10:09:37

+0

@ J-16SDiZ他并不意味着“刷新缓冲区“,他的意思是”清除屏幕“。 – TLP 2012-02-20 10:11:19

+0

我不认为你的意思是“冲洗”,因为它指的是立即打印到屏幕上的缓冲区。您正在寻找一种方法来删除已经打印的东西。 – Nick 2012-02-20 10:13:11

回答

4

如前所述,只需设置$ |以真正的价值将自动刷新你的结果。

当你说,“HAI应显示5秒钟,它应该被删除,并没有输出应该像油灰终端在那里。”,你所描述的实际上是除去了丝网印刷的文字。

要做到这一点,你需要使用特殊的输出。有关perl模块,请参阅Term :: ANSIScreen,这将有助于您做到这一点。

下面是一些代码,做你在找什么:

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

$| = 1; 

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

这正是我想要的东西,感谢您的帮助 – 2012-02-20 11:56:25

+0

我很高兴它帮助! – GoldenNewby 2012-02-20 20:45:00

1

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

只需在您的print之前/之后添加此行。

$| = 1; 

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

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

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

+0

在上面提到的一个很好,但我想删除脚本的所有行。 Bu上面的脚本只删除一行。 – 2012-02-20 12:10:12

+0

我明白了,我们可以通过调用函数clup()来获得它。 。无论如何,再次感谢每一个人。 – 2012-02-20 12:28:48

3

此代码执行特定的技巧,我认为你是后:

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

\r将光标移动回线的起点,然后覆盖哪些先前写入。

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

1

是什么意思冲洗

如前所述两个答案misundestand你的问题,让我点:单词“在Perl冲洗”(而不是只)上下文中是指迫使缓冲输出的打印输出。要了解它是什么,尝试某事像

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

相反,你可能会发生什么,60秒,你会得到任何输出,那么60个字母。这是因为perl缓冲stdout输出并仅在换行符,文件关闭或缓冲区满时发送它。实际发送此缓冲区的操作称为flush,出于某种原因或其他原因。

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

清除屏幕

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

perl myscript.pl > somefile.txt 

和打印的东西,比这事情会在无论你做什么somefile.txt降落。

当屏幕输出或控制台,有很多种方法,但是他们依赖于它是什么样的控制台。在许多情况下,根据TLP建议的方式发送\ r。在其他情况下,您可以使用终端控制代码(由curses库包装)。

但也有些情况下它不起作用,例如我已经提到的那个(当你输出到文件时)或者当你使用一些不符合标准的控制台时(频繁的情况是从某些文本运行脚本编辑器或IDE)。

因此,要总结:

  • 如果你真的需要原路返回输出,重新考虑你的设计,

  • 如果你正在写一些文字进度条或某物类似的交互脚本,使用\ r或考虑转移到诅咒或可能Term::Screen。或检查更高级别可用的模块,像Term::ProgressBar

1

我得到了它,我们可以通过调用函数clup得到它(); 。总之再次感谢每一位

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

$| = 1; 

savepos; 
print "HAI"; 
print "HAI"; 
print "HAI"; 
print "HAI"; 
sleep 2; 
loadpos; 
clup(); 

这为我工作:)

2

我用

system("clear"); 

希望这有助于!