2012-02-20 43 views
1

スクリプトを実行した後に出力をフラッシュして、すべての出力が端末の画面に表示されないようにします。Perlで出力後の画面を消去します

は私が上記のスクリプト

# ./file 
HAI 
# 

を実行すると、私はHAIが表示されるはずです

# ./file 
# 

として上記の出力を持っていると思い、次の例

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

を持っていると言います5秒間、それは削除されるべきであり、出力はputtyのような端末には存在しないはずです。

+0

[どのようにフラッシュファイルをperlで?](http://stackoverflow.com/questions/4538767/how-flush-file-in-perl) –

+0

@ J-16SDiZ彼は "バッファ "、彼は"画面をクリア "を意味します。 – TLP

+0

バッファに画面がすぐに印刷されることを意味するので、 "flush"を意味するとは限りません。既に印刷されたものを取り除く方法を探しています。 – Nick

答えて

4

既に述べたように、$ |真の値に設定すると、結果が自動的にフラッシュされます。

「HAIを5秒間表示する必要があります。削除する必要があり、出力がputtyのように端末に表示されません」というメッセージが表示された場合は、実際に印刷されたテキストを画面から削除する方法について説明しています。

これを行うには、特別な出力を使用する必要があります。 Term :: ANSIScreenを参照して、それを行うのに役立つperlモジュールを1つ探してください。

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

$| = 1; 

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

これはちょうど私が欲しいものであり、助けをありがとう –

+0

私はそれが助けてうれしい! – GoldenNewby

1

$|は、フラッシュ動作を制御する変数です。それを確認してくださいhere

printの前後にこの行を追加してください。

$| = 1; 

あなたがxterm使用している場合は、文字列\e[2Jは全体のターミナルウィンドウをクリアするために使用されます。あなたは可能です

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

他の端末については、対応する文字シーケンスを検索することができます。

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

\rバックラインの先頭にカーソルを移動して、以前に書かれたものを上書きします:

+0

上記の説明では問題ありませんが、スクリプトのすべての行を削除したいと思います。上記のスクリプトは1行だけを削除しています。 –

+0

私はclup()関数を呼び出すことでそれを得ることができます。 。とにかく、お互いに感謝します。 –

3

このコードは、私はあなたが後にしていると思う特定のトリックを実行します。

しかし、これはややハックです。あなたはおそらくCursesのようなものを探しています。

1

それはすでに

として2つの答えmisundestandあなたの質問、聞かせてくれポイントフラッシュするために何を意味するのでしょう:単語を "ここで

は、あなたが探しているものを行い、いくつかのコードですコンテキストだけでなく、perlでフラッシュするということは、バッファされた出力を強制的に出力することを意味します。それが何であるかを理解するために、60秒間あなたは、60文字何も出力を取得していないでしょう、あなたが期待するかもしれないものに反して

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

ようSTHを試してみてください。これは、perlがstdout出力をバッファして改行、ファイルクローズ、またはバッファが一杯になったときにのみ送信するためです。また、実際にこのバッファを送信する動作は、理由の1つまたは別の理由で、フラッシュと呼ばれます。

$ | = 1($ |はAUTOFLUSHと呼ばれることがあり、設定されていると、すべての文字に標準出力バッファをフラッシュします)という前提で、この動作が変更されますが、実際の問題あなたが持っている。画面クリア

は、一般的に

出力をクリアする方法はありません。この何かが何をするにしてもsomefile.txtに着陸する予定より具体的には、あなたは、

perl myscript.pl > somefile.txt 

と印刷何かのようにスクリプトをファイルにリダイレクトします。

出力が画面またはコンソールの場合、さまざまな方法がありますが、コンソールの種類によって異なります。多くの場合、TLPを提案すると送信されます。他の場合は、端末制御コード(cursesライブラリでラップされています)を使用することができます。

しかし、すでに言及したもの(ファイルに出力したとき)や不適合なコンソールを使用したときなどに役立つこともあります(よくあるケースではテキストからスクリプトを実行しています)エディタまたはIDE)。

だから、

、要約する:あなたが本当に出力をバックトラックする必要がある場合

  • は、あなたのデザインを再考、

  • あなたには、いくつかのテキストのプログレスバーまたは対話型スクリプトのSTH同様のを書いている場合は、使用を\ rまたはCursesに移動するか、おそらくTerm::Screenを検討してください。それとも我々は()関数のclupを呼び出すことによってそれを得ることができTerm::ProgressBar

1
私はそれを得た

のような高レベルの利用可能なモジュールを確認してください。 。とにかく、再び一つ一つ

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"); 

を使用します!

関連する問題