我想在执行脚本后刷新输出,并且所有输出都不应出现在我的终端屏幕中。
说我有以下示例
#!/usr/bin/perl
print "HAI \n";
sleep 5;
如果我执行上述脚本
# ./file
HAI
#
我想将上述输出作为
# ./file
#
HAI应该显示5秒钟,它应该被删除,并且终端中不应该像putty那样输出。
答案 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();
这对我有用:)