2009-02-06 5 views
9

나는 인수 나 파이프 된 데이터가 Perl 스크립트에 전달되지 않을 가능성을 처리하려고합니다. 인수가 없으면 입력이 STDIN을 통해 파이프됩니다. 그러나 사용자가 인수를 제공하지 않고 스크립트에 아무 것도 보내지 않으면 키보드 입력을 시도합니다. 내 목표는 대신 오류 메시지를 제공하는 것입니다.선택을 사용하지 않고 Perl의 파이프 된 데이터에 대해 STDIN을 검사 (peek) 할 수 있습니까?

불행히도 select()은 일부 비 POSIX 시스템으로 이식 할 수 없습니다. 이식성을 최대화하면서 다른 방법이 있습니까?

답변

19

. 그래서, 당신은이 작업을 수행 할 수 있어야한다 :

if (-t STDIN and not @ARGV) { 
    # We're talking to a terminal, but have no command line arguments. 
    # Complain loudly. 
} 
else { 
    # We're either reading from a file or pipe, or we have arguments in 
    # @ARGV to process. 
} 

는 가장 일반적인 펄에서 이식해야하므로 빠른 테스트, 펄 5.8.8와 펄 5.10.0, 리눅스와 윈도우에서이 작업 벌금을 보여준다 환경.

다른 사람들이 언급했듯이 select은 프로세스를 읽는 중일 수 있으므로 신뢰할만한 선택이 아니지만 프로세스가 아직 작성을 시작하지 않았습니다.

모든 최고의,

+0

내가 할 수 있다면 Mac OS X. +5에서 작동하도록 확인되었지만 +1 할 수는 없습니다. –

5
use POSIX 'isatty'; 
if (! @ARGV && isatty(*STDIN)) { 
    die "usage: ..."; 
} 

참조 : 파이프로 연결된 정보는 아직 준비가되어 있지 않았다 경우가 을 거짓 결과를 얻을 것이기 때문에 선택 http://www.opengroup.org/onlinepubs/009695399/functions/isatty.html

주, 어쨌든 많은 도움이되지 않을 것입니다. 예 : 펄이 특정 파일 핸들이 TTY에 열려있는 경우를 알려주는 -t 파일 테스트 연산자와 함께 제공

seq 100000|grep 99999|perl -we'$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)' 
+0

이'당신이 너무 POSIX를()'를 사용하고 선택보다 더 좋은 것은 아닙니다. OP는 구체적으로 말했다 : * 불행하게도, select()는 POSIX가 아닌 시스템에서는 이식성이 없다. * – nyuszika7h

+0

비 POSIX 이식성이 중요한 부분을 선택하는 것보다 낫지 만 설명하고있다. – ysth

관련 문제