我想在执行脚本后刷新输出,并且所有输出都不应该出现在我的终端屏幕中。在Perl中输出后清零屏幕
说我有一个下面的例子
#!/usr/bin/perl
print "HAI \n";
sleep 5;
如果我执行上面的脚本
# ./file
HAI
#
我想有上述输出
# ./file
#
HAI应显示持续5秒钟,它应该被删除,并且像putty这样的终端中没有输出。
我想在执行脚本后刷新输出,并且所有输出都不应该出现在我的终端屏幕中。在Perl中输出后清零屏幕
说我有一个下面的例子
#!/usr/bin/perl
print "HAI \n";
sleep 5;
如果我执行上面的脚本
# ./file
HAI
#
我想有上述输出
# ./file
#
HAI应显示持续5秒钟,它应该被删除,并且像putty这样的终端中没有输出。
如前所述,只需设置$ |以真正的价值将自动刷新你的结果。
当你说,“HAI应显示5秒钟,它应该被删除,并没有输出应该像油灰终端在那里。”,你所描述的实际上是除去了丝网印刷的文字。
要做到这一点,你需要使用特殊的输出。有关perl模块,请参阅Term :: ANSIScreen,这将有助于您做到这一点。
下面是一些代码,做你在找什么:
use strict;
use Term::ANSIScreen qw/:cursor :screen/;
$| = 1;
savepos;
print "HAI";
sleep 5;
loadpos;
clline();
这正是我想要的东西,感谢您的帮助 – 2012-02-20 11:56:25
我很高兴它帮助! – GoldenNewby 2012-02-20 20:45:00
$|
是变量控制刷新行为。检查它here
只需在您的print
之前/之后添加此行。
$| = 1;
如果使用xterm
,字符序列\e[2J
是用来清除整个终端窗口。您可以
$| = 1;
print "anything";
sleep 5;
print "\e[2J";
对于其他终端,您可以查找对应的字符序列。
在上面提到的一个很好,但我想删除脚本的所有行。 Bu上面的脚本只删除一行。 – 2012-02-20 12:10:12
我明白了,我们可以通过调用函数clup()来获得它。 。无论如何,再次感谢每一个人。 – 2012-02-20 12:28:48
此代码执行特定的技巧,我认为你是后:
$| = 1; # set autoflush on STDOUT to avoid buffer problems
print "HAI "; # note no newline
sleep 5;
print "\r \n";'
\r
将光标移动回线的起点,然后覆盖哪些先前写入。
但这有点破解。您可能正在寻找类似Curses的东西。
是什么意思冲洗
如前所述两个答案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
我得到了它,我们可以通过调用函数clup得到它(); 。总之再次感谢每一位
use strict;
use Term::ANSIScreen qw/:cursor :screen/;
$| = 1;
savepos;
print "HAI";
print "HAI";
print "HAI";
print "HAI";
sleep 2;
loadpos;
clup();
这为我工作:)
我用
system("clear");
希望这有助于!
可能重复[如何刷新perl文件?](http://stackoverflow.com/questions/4538767/how-flush-file-in-perl) – 2012-02-20 10:09:37
@ J-16SDiZ他并不意味着“刷新缓冲区“,他的意思是”清除屏幕“。 – TLP 2012-02-20 10:11:19
我不认为你的意思是“冲洗”,因为它指的是立即打印到屏幕上的缓冲区。您正在寻找一种方法来删除已经打印的东西。 – Nick 2012-02-20 10:13:11