在Perl中输出后清除屏幕

时间:2012-02-20 09:51:06

标签: perl

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

说我有以下示例

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

如果我执行上述脚本

# ./file
HAI
#

我想将上述输出作为

# ./file
#

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

6 个答案:

答案 0 :(得分:4)

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

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

为此,您需要使用特殊输出。请参阅Term :: ANSIScreen了解一个可帮助您实现此目的的perl模块。

以下是一些能够满足您需求的代码:

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

$| = 1;

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

答案 1 :(得分:3)

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

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

\r会将光标移回到行的开头,然后覆盖以前写的内容。

但这有点像黑客。您可能正在寻找类似Curses的内容。

答案 2 :(得分:2)

我用

 system("clear"); 

希望这有帮助!

答案 3 :(得分:1)

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

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

$| = 1;

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

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

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

答案 4 :(得分:1)

刷新

是什么意思

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

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

与你的期望相反,60秒你将得不到输出,然后是60个字母a。这是因为perl缓冲stdout输出并仅在换行符,文件关闭或缓冲区已满时发送它。实际发送此缓冲区的操作称为flush,原因之一或其他原因。

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

清除屏幕

一般情况下,无法清除输出。特别是,如果您将脚本重定向到文件,如

perl myscript.pl > somefile.txt

并打印一些东西,而不管你做什么都会在somefile.txt中出现。

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

但是也会出现无法帮助的情况,例如我已经提到的那个(当你输出到文件时)或当你使用一些不符合规范的控制台时(频繁的情况是从某些文本编辑器运行脚本)或IDE)。

所以,总结一下:

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

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

答案 5 :(得分:1)

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

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

$| = 1;

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

这对我有用:)