2011-12-20 1 views
1

다른 사람이 작성한 스크립트를 수정하려고하는데 스크립트를 스크립트와 별도로 유지하려고합니다.다른 perl 스크립트의 중간에서 시스템 호출을 사용하여 perl 스크립트에서 값을 얻을 수 있습니까?

필자가 작성한 스크립트는 공백으로 구분 된 모든 관련 데이터를 출력하는 print 줄로 끝납니다.

예는 : print "$sap $stuff $more_stuff";

나는 다른 펄 스크립트의 중간에이 데이터를 사용하려면 그것은 내가 쓴 스크립트에 시스템 호출을 사용 가능 있는지 확실하지 않습니다.

예 :

system("./sap_calc.pl $id"); #obtain printed data from sap_calc.pl here는이 작업을 수행 할 수 있습니까? 그렇지 않다면 어떻게해야합니까?


다소 관련,하지만 system()를 사용하지 않는 :

How can I get one Perl script to see variables in another Perl script?

How can I pass arguments from one Perl script to another?

+2

사용중인 기능에 대한 설명서를 읽으십시오! "perldoc -f 시스템"은 3 번째 단락에서 질문에 대한 대답입니다. " 명령에서 출력을 캡처하는 데 사용하려면 은 단지 사용해야 ..." – tadmc

답변

5

당신이 찾고있는 "역 따옴표 연산자."

perlop 섹션의 "견적과 같은 연산자"를 살펴보십시오.

일반적으로, 프로그램의 출력을 캡처 같이 진행한다 : 백틱 오퍼레이터 만 STDOUT 캡처

my $output = `/bin/cmd ...`; 

정신있다. 따라서 모든 것을 포착하려면 (STDERR도) 명령에 일반적인 쉘 방향 전환 "2>&1"을 추가해야합니다.

+0

s/STDIN/STDOUT/ – ephemient

+0

실행했습니다. 치환. 감사합니다, @ephemient –

+3

STDERR을 사용하려면 [open3'] (http://search.cpan.org/perldoc?IPC::Open3)도 있습니다. –

4

다른 스크립트의 stdout에 인쇄 된 데이터를 사용하려면 backticks or qx()을 사용해야합니다.

system은 실제 출력이 아닌 셸 명령의 반환 값만 반환합니다.

올바른 방법은 module을 작성하거나 do을 사용하여 실제 코드를 다른 스크립트로 가져 오는 것입니다.

일반적으로 "단순화"의 방법으로 시스템/셸에 의존하는 것보다 모든 펄 솔루션을 사용하는 것이 좋습니다.

myfile.pl :

sub foo { 
    print "Foo"; 
} 
1; 

main.pl :

do 'myfile.pl'; 
foo(); 
1

perldoc perlipc

역 인용 부호, 쉘 (문자열로 명령의 표준 출력을 얻을 것처럼 또는 배열, 컨텍스트에 따라 다름). 그들은 더 명확하게 따옴표 같이 qx 통신 수로 쓰여질 수 있습니다.

@lines = `./sap_calc.pl $id`; 
@lines = qx(./sap_calc.pl $id); 
$all = `./sap_calc.pl $id`; 
$all = qx(./sap_calc.pl $id); 

open

도 ( qx이처럼) 스트리밍 대신 한 번에 메모리로 읽어 사용할 수 있습니다. 이는 쉘을 우회하여 모든 종류의 인용 문제를 피할 수 있습니다.

open my $fh, '-|', './sap_calc.pl', $id; 
while (readline $fh) { 
    print "read line: $_"; 
}