2010-06-04 2 views
6

나는 표준 입력을 잡고 스크립트를 가지고 :Perl에서 표준 입력이 있는지 판별하는 방법은 무엇입니까?

myscript.pl -param1=a -param2=b 

나는이 서브 루틴에 박히 :

&process_input 

sub process_input { 
    while(<STDIN>) { 
     $log_data .= $_; 
    } 
} 

내가 스크립트를 실행

. 내가 할 경우 모든 것이 잘 돌아갑니다.

echo "" | myscript.pl -param1=a -param2=b 

질문 표준을 넣었는지 어떻게 결정합니까? while()은 false를 반환하고 실행하지 않지만 실제로는 'stuck'이라는 이유로 입력을 기다리고 있다고 생각할 것입니다.

+1

[STDIN이 Perl의 터미널에 연결되어 있는지 어떻게 알 수 있습니까?] (http://stackoverflow.com/questions/528781/how-can-i-tell-if-stdin-is-connected -to-a-terminal-in-perl) – Ether

답변

18

STDIN (STanDard INput)이 어디에서 왔는지 확인하고 싶습니다. 다른 응용 프로그램이나 터미널. 귀하의 경우에는 사용자가 무언가를 입력 할 때까지 읽기 작업으로 인해 프로세스가 멈추는 두 번째 옵션입니다. 해결책은 How can I tell if STDIN is connected to a terminal in Perl?을 참조하십시오.

if (-t STDIN) { 
    # input attached to terminal and will probably ask user 
} else { 
    # input from other process 
} 

더 나은 /보다 안정적인 검사를 수행 할 수도있는 IO::Interactive이 있습니다.

+0

고마워! 스크립트는 다른 응용 프로그램에서 실행할 수도 있으므로 -t 옵션을 사용할 수 있습니다. – EDJ

2

<STDIN> 문은 콘솔에서 "enter"키를 누를 때까지 표시되지 않습니다. 이 문제를 해결하려면 IO::Handle을 사용하여 STDIN을 감싸고 $stdin->blocking(0)을 호출하여 논 블로킹 IO를 사용할 수 있다고 생각합니다.

+2

이 문제는 입출력을 차단하지 않지만 ''('readline (* FILEHANDLE) '과 동일)이 입력 행을 찾고 있습니다. '\ n' (기술적으로는 입력 레코드 분리 자'$ /'의 인스턴스)가 발견 될 때까지 리턴되지 않습니다.핸들이 블로킹인지 여부는 중요하지 않습니다. 또한,'IO :: Handle'을 사용한다면, 기존 글로벌 핸들에서 그것의 메소드를 간단히 사용할 수 있습니다 :'STDIN-> blocking (0);' – daotoad

1

그건 정상입니다. 유닉스 툴의 표준 사용법은 입력 파일이 인자로 주어지지 않는다면 STDIN을 사용하는 것이다. 단지

tool < /dev/null 

내가 강하게 상관없이 당신이 달성하는 방법 문제를 소개하지 않습니다로 "입력"사용할 수 있는지 확인하려고 무리를 줄 경우, catless, grep 등이 입력을 제공하기 위해 발신자에게 달려 시도 이. 특히 -t을 피하십시오. 필요할 때 터미널을 위조하는 것이 문제가되기 때문에. 대신,보다 전통적인 인터페이스에 의존하십시오.

입력 도구를 사용하지 않으려면 처음에는 STDIN을 사용하는 것이 이상합니다. 일반적으로 선택적 인수를 사용합니다.

tool --foo file 
tool --foo <(echo "") 

또 다른 옵션은 입력이 없을 때 사용자에게 알려주는 것입니다.

인터페이스의 디자인 문제를 해결하려면 도구가하는 일을 파악하는 것이 좋습니다.

0

사용자가 Ctrl + D (파일 끝 문자)를 입력하면 프로그램이 계속됩니다.

관련 문제