2012-02-20 71 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"); 

希望這有助於!