2014-10-13 3 views
0

필자의 perl 스크립트가 if 문을 건너 뛰고 while 루프를 먼저 실행하는 것으로 보입니다. while 루프를 꺼내면 예상되는 동작 (일부 텍스트 인쇄 및 진행)을 얻게됩니다. 나는 perl 경험이 없기 때문에 이것이 내가 모르는 언어의 내부인지 궁금해하고있다.while 루프가 while 루프를 선호하여 perl 스킵 구문을 사용하는 이유

$choice = <STDIN>; 
chomp($choice); 

if($choice == 1) 
{ 
    print 'snap.exe'; 
    @args = ('snap.exe'); 
} 
elsif($choice == 2) 
{ 
    print 'v2u.exe'; 
    @args = ('v2u.exe'); 
} 
elsif($choice == 3) 
{ 
    print 'ImageMagick'; 
    @args = ('import','-depth','8','-window'); 
} 

while(1) 
{ 
    #dostuff 
} 
+2

코드 호출 방법을 보여줍니다. STDIN은 명령 행에 뭔가를 전달한다고 가정합니다. 1, 2 또는 3과 일치하지 않으면 if는 건너 뜁니다. – toolic

+2

버퍼링 문제가 아닙니까? 'if-elsif' 브랜치 전체 앞에'$ | = 1; – raina77ow

+3

출력이 버퍼링되고 있습니다 :'print "snap.exe \ n";'출력을 강제합니다 – RobEarl

답변

5

You're suffering from buffering.

인쇄 명령문 앞에 $| = 1을 추가하면 버퍼링과 줄 바꿈을하지 않고 바로 출력 할 수 있습니다. perlvar $OUTPUT_AUTOFLUSH에서

: 제로로 설정하면

  • HANDLE->autoflush(EXPR)
  • $OUTPUT_AUTOFLUSH
  • $|

    는 바로 모든 작성하거나 현재 선택된 출력에 인쇄 한 후 플러시를 강제로 채널. 기본값은 0입니다. 채널이 실제로 시스템에 의해 버퍼링되는지 여부에 관계없이 $|은 Perl이 각 쓰기 후에 명시 적으로 플러시하도록 요청했는지 여부 만 알려줍니다. STDOUT은 출력이 터미널에 있고 그렇지 않으면 버퍼링 된 경우 일반적으로 라인 버퍼링됩니다. 이 변수를 설정하는 것은 주로 파이프 나 소켓으로 출력 할 때 유용합니다. 예를 들어, rsh에서 Perl 프로그램을 실행하고있을 때와 같이 출력을보고 싶을 때 유용합니다. 이것은 입력 버퍼링에 영향을 미치지 않습니다. 이에 대해서는 getc을 참조하십시오. 출력 채널을 선택하는 방법은 select을 참조하십시오. IO::Handle도 참조하십시오.

    니모닉 : 배관이 뜨거워 지길 원할 때.

관련 문제