我想在執行腳本後刷新輸出,並且所有輸出都不應該出現在我的終端屏幕中。在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