2012-02-20 2 views
1

스크립트를 실행 한 후 출력을 플러시하고 모든 출력이 터미널 화면에 나타나지 않아야합니다. Perl에서 출력 후 화면 지움

내가 위의 스크립트를

# ./file 
HAI 
# 

을 실행하면 내가 가 HAI가 표시되어야합니다

# ./file 
# 
로 위의 출력을하고 싶습니다 다음 예

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

을 말해봐 5 초 동안 삭제되어야하며 퍼티와 같은 터미널에는 출력이 없어야합니다.

+0

[어떻게 플러시 파일을 펄에서?] (http://stackoverflow.com/questions/4538767/how-flush-file-in-perl) –

+0

@ J-16SDiZ 그는 " 버퍼 ", 그는"화면을 지우다 "를 의미합니다. – TLP

+0

화면에 즉시 인쇄되는 버퍼를 의미하므로 "플러시"를 의미하지는 않습니다. 이미 인쇄 된 것을 제거하는 방법을 찾고 있습니다. – Nick

답변

4

이미 설명한 바와 같이 $ | true 값으로 설정하면 결과가 자동으로 플러시됩니다.

"HAI는 5 초 동안 표시되어야하며 삭제되어야하며 퍼티와 같은 터미널에는 출력이 없어야합니다."라고 말하면 실제로 화면에서 인쇄 된 텍스트를 제거하는 방법을 설명합니다.

이렇게하려면 특수 출력을 사용해야합니다. Term :: ANSIScreen에서 perl 모듈 하나를 찾으십시오. 이 말은 무엇을

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

위에서 언급 한 스크립트는 괜찮지 만 스크립트의 모든 줄을 제거하고 싶습니다. 위의 스크립트는 한 줄만 제거합니다. –

+0

나는 그것을 clup() 함수를 호출하여 얻을 수있다. . 어쨌든 다시 한번 감사드립니다. –

3

이 코드는 당신이 후 생각 특정 트릭을 수행합니다.

하지만 그건 다소 해킹입니다. 아마도 Curses과 같은 것을 찾고있을 것입니다.

1

에게 이미 두 답변 misundestand 질문을 플러시 나에게 점을 수 있도록 : 단어를 '여기

은 당신이 찾고있는 것을 않는 일부 코드입니다 맥락에서 플러시 (flush)는 버퍼 된 출력을 강제로 출력하는 것을 의미합니다. 그것에 대해 무엇인지 이해하기 위해, 60 초 동안 다음 60 개 문자 A를 더 출력을 얻을 것이다, 당신이 예상 할 수 것과는 달리

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

같은 STH를보십시오.이는 perl이 stdout 출력을 버퍼링하고 줄 바꿈, 파일 닫기 또는 버퍼가 꽉 찬 경우에만 전송하기 때문입니다. 그리고 실제로이 버퍼를 보내는 동작을 플러시라고합니다.

$ | = 1 ($ |은 AUTOFLUSH라고도하며 실제로 인쇄 할 때마다 "표준 출력 버퍼를 비우십시오"라는 의미입니다.) 위에서 설명한 것처럼 동작이 변경되지만 실제 문제는 아닙니다. 너는 가지고있다. 화면 지우기

는 일반적으로

출력을 취소 할 수있는 방법이 없습니다. 이 일이 당신이 어떤 somefile.txt에 착륙 것보다 특히, 당신은

perl myscript.pl > somefile.txt 

및 인쇄 무언가 같이 파일에 스크립트를 리디렉션합니다.

출력이 화면이나 콘솔 인 경우 다양한 방법이 있지만 콘솔 종류에 따라 다릅니다. 많은 경우 TLP가 제안한대로 보내면됩니다. 다른 경우에는 터미널 제어 코드 (curses 라이브러리로 싸여 있음)를 사용할 수 있습니다.

그러나 내가 이미 언급 한 (파일로 출력 할 때) 또는 부적합한 콘솔을 사용할 때도 도움이되지 않는 경우도 있습니다 (빈번한 경우는 일부 텍스트에서 스크립트를 실행 중입니다). 편집기 또는 IDE).

그래서

, 요약하기 : 당신이 정말로 출력을 역 추적해야하는 경우

  • , 당신의 디자인을 재고,

  • 일부 텍스트 진행률 표시 줄 또는 대화 형 스크립트 STH 비슷한을 작성하는 경우, 사용을 \ r 또는 Curses로 이동하거나 어쩌면 Term::Screen을 고려하십시오. 또는 위와 같은 상위 수준 모듈을 확인하십시오. Term::ProgressBar

1

나는 clamp() 함수를 호출하여 얻을 수 있습니다. . 어쨌든 다시 이것은 나를 위해 일한 각자

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

호프를 사용!