2013-07-29 2 views
1

필자는 스크립트에서 진행 보고서를 실행 파일로 인쇄하여 작업 중인지와 얼마나 오래 기다려야 하는지를 알 수 있습니다. 그러나 perl은 명령이 실행되는 것보다 결국 모든 출력을 인쇄하는 것처럼 보입니다. 나는 또한 같은 결과를 시도Perl : 실행 중 실시간 업데이트를 얻는 방법

print("before pause"); 
sleep 10; 
print("after pause"); 

:

my $filename="out"; 
open(OUT, ">>$filename"); 
print OUT "before pause"; 
sleep 10; 
print OUT "after pause"; 

이 나는 ​​'여부를 어떻게 예를 들어,이 프로그램은 10 초 동시에, 다음 "pauseafterpause 전에"인쇄물을 기다립니다 m 로컬에서 실행 중이거나 클러스터에 제출 중입니다.

다른 사람들이 작성한 펄 스크립트를 실행하면 이것이 가능함을 알고 있습니다. 그러나 그들의 코드를 살펴봄으로써 그들이 어떻게하고 있는지 말할 수는 없습니다. 아무도 나를 계몽 수 있습니까? 고맙습니다!

+1

"버퍼링 문제"- http://www.plover.com/FAQs/Buffering.html –

답변

5

효율을 위해 출력을 버퍼링합니다. 터미널에 print 인 경우, 출력은 라인 버퍼됩니다. 즉시 표시하도록 줄 바꿈하여 정보를 종료 : 당신의 출력 (파일 또는 파이프) 리디렉션 된 경우이보다 효율적이기 때문에

print "before\n"; 
sleep 3; 
print "after\n"; 

, 다음 블록 버퍼링이 사용됩니다. 파일이 tail 인 경우를 제외하고는 대개 OK입니다. IO를

local $| = 1; 
print "before"; 
sleep 3; 
print "after"; 

을하지만 genenerally, 당신은 사용해야하지 않으면 당신이 핸들을 버퍼 해제하고자하는 핸들이 현재 (STDOUT 기본적으로) 선택되어있는 동안, 당신은 1$| 변수를 설정하여, 버퍼링을 해제 할 수 있습니다 : : 이것에 대한 처리 방법 :

$some_handle->autoflush(1); 
...; 

(ikegami의 답변 참조).

출력 핸들은 오류 또는 프로그램의 기본 출력이 아닌 다른 출력용으로 사용됩니다. 기본적으로 버퍼링되지 않으며 진행률 보고서를 인쇄하는 데 매우 적합합니다. 이것도 잘 작동합니다.

print STDERR "before"; 
sleep 3; 
print STDERR "after"; 
3

먼저, 아무 이유없이 전역 변수 사용을 중지하십시오. open이 성공했는지 여부에 대한 간단한 점검을 추가하십시오.

open(my $OUT, ">>", $filename) or die $!; 

당신은 단순히 그럼 당신은 정상으로 인쇄 할 수 있습니다

use IO::Handle; # Only needed for older versions of Perl 
$OUT->autoflush(1); 

버퍼링

을 해제해야합니다.

print $OUT "text\n"; 
관련 문제