2008-09-16 5 views
3

Perl 스크립트의 중간에는 실행하려는 시스템 명령이 있습니다. stdin에 입력해야하는 데이터가 들어있는 문자열이 있는데 (이 명령은 stdin의 입력 만 허용 함) stdout에 기록 된 출력을 캡처해야합니다. 필자는 Perl에서 시스템 명령을 실행하는 다양한 방법을 살펴 보았습니다. open 함수는 필요한 것처럼 보이지만, stdin 또는 stdout 만 캡처 할 수있는 것만 큼 다를뿐입니다.Perl 스크립트에서 stdin 및 stdout 시스템 명령을 캡처하는 방법은 무엇입니까?

지금은 내 최선의 해결책은 open을 사용하고 stdout을 임시 파일로 리디렉션하고 명령이 완료된 후 파일에서 읽는 것 같습니다. 더 나은 해결책이 있습니까?

답변

2

나는를위한 특별한 펄 명령이 있습니다 당신이 IPC::Open2

3

스크립트 상단에 줄을 포함하십시오.

use IPC::Open2; 

여기에는 필요한 대부분의 Perl 배포판에 기본적으로 설치되는 필수 모듈이 포함됩니다. (당신이 그것을 할 수없는 경우, 당신은 CPAN을 사용하여 설치할 수 있습니다.) 다음에, 대신 개방, 호출의 :

$pid = open2($cmd_out, $cmd_in, 'some cmd and args'); 
당신은 $ cmd_in에 전송하여 명령에 데이터를 전송하고 읽을 수

명령의 $ cmd_out에서 읽음으로써 출력.

명령의 stderr 스트림도 읽을 수있게하려면 대신 IPC :: Open3 모듈을 사용할 수 있습니다.

+1

이것을 읽는 모든 사람에게이 예제처럼 베어릭 파일 핸들을 사용하지 말아야합니다. 이 문서를보십시오 : http://www.perlfoundation.org/perl5/index.cgi?bareword_uppercase_filehandles –

0

나는 항상 내가 단지 출력의 한 줄을 기대하고있어 경우에이 방법을하거나 줄 바꿈 이외의 결과를 분할 할 :

my $result = qx(command args 2>&1); 
my $rc=$?; 
# $rc >> 8 is the exit code of the called program. 

if ($rc != 0) { 
    error(); 
} 

것은 당신이 다중 처리하려면 라인 응답은, 배열로 결과를 얻을 다음 perlipc documentation는 IPC :: Open2 및 IPC :: 된 Open3을 포함하여 당신이 할 수있는 많은 방법을 포함

my @lines = qx(command args 2>&1); 

foreach (my $line) (@lines) { 
    if ($line =~ /some pattern/) { 
     do_something(); 
    } 
} 
+0

예제가 STDIN을 처리하는 곳이 보이지 않습니다. –

3

.

6

IPC :: Open2/3는 잘하지만 나는 보통 내가 정말 필요 최소한의 복잡성을 정말 잘 간단한 경우를 처리하는 IPC::Run3 것으로 나타났습니다 :

use IPC::Run3; # Exports run3() by default 

run3(\@cmd, \$in, \$out, \$err); 

문서는 IPC 비교 : : 다른 대안으로 Run3. 당신이 그것을 사용하기로 결정하지 않은 경우에도 읽을 가치가있다.

0

당신이 추가 패키지를 포함하지 않는 경우, 당신은 당신이 어떤 제안의 반대입니다

open(TMP,">tmpfile"); 
print TMP $tmpdata ; 
open(RES,"$yourcommand|"); 
$res = "" ; 
while(<RES>){ 
$res .= $_ ; 
} 

을 수행 할 수 있습니다뿐만 아니라 작동합니다.

2

내가 최근에 발견 한 매우 쉬운 방법은 IPC::Filter 모듈입니다. 당신이 목록을 전달하면이 쉘을 거치지 않고 명령을 호출하는 방법을

$output = filter $input, 'somecmd', '--with', 'various=args', '--etc'; 

참고 : 그것은 당신이 매우 직관적으로 작업을 수행 할 수 있습니다. 또한 일반적인 유틸리티에 대한 오류를 처리하는 합리적인 작업을 수행합니다. (오류 발생시에는 STDERR의 텍스트를 오류 메시지로 사용하여 die 초를 성공 시키면 STDERR은 폐기됩니다.)

물론 엄청난 양의 데이터에는 적합하지 않습니다. 스트리밍 처리; 또한 오류 처리가 사용자의 요구에 충분히 세밀하지 않을 수도 있습니다. 하지만 실제로 많은 간단한 사례가 간단합니다.

관련 문제