2013-05-02 3 views
1

는 펄 기능 거기에 어느 내장 또는 다음과 같다 도서관에서 사용자 정의 파일 핸들과 외부 명령을 엽니 다 stderr이 ERR_FILEHANDLE로 이동합니다.

system($cmd); 

그리고 :

run(STDIN, STDOUT, STDERR, $cmd); 

은 유사합니다 내가 open($fh, "|$cmd");을 찾을

open(IN, OUT, ERR, "|$cmd|"); 

: 수 있을까요

run(IN, OUT, ERR, $cmd); 

의 존재하지 않는 버전 같은 비트 , 및 open($fh, "$cmd|"); 사용하기 쉽고, 나는 단지 파일 핸들에서 읽기/쓰기 만한다. 나는 두 가지 방법으로 작동하는 것을 원한다.

선택적으로 스칼라를 읽고 쓸 수있는 경우 보너스 포인트.

나는 open3과 으로 작업을하고 있었지만 제대로 작동하지 않는 것 같습니다. (예를 들어 grep라고 쓰여있는) 실제 사례가 인정 될 것입니다.

편집 :

start \@cmd_arr, $stdin_fh, $stdout_fh, $stderr_fh; 
print "Opened"; #2 
print $stdin_fh "Input to command\n"; #3 

명령을 실행합니다 :

open3($stdin_fh, $stdout_fh, $stderr_fh, $refresh_exec); #1 
print "Opened"; #2 
print $stdin_fh "Input to command\n"; #3 

라인 # 2

에 도달하고 IPC::Run 사용하기 전에 멈춘 것 같다 응답은, 내 현재 코드 주석에 그러나 쓰기는 오류를 제공합니다 : Can't use an undefined value as a symbol reference.

내 코드가 불완전하다는 것을 알고 있지만 코드 400 줄을 붙여 넣지 않으려 고하고 성공적으로 잘라내어 문제를 격리 할 수 ​​있다면 질문 할 필요가 없습니다.

open3 또는 IPC::Run이 내가 원하는대로 처리 할 수 ​​있는지 확신 할 수 없으므로 위에 구축 할 수있는 작업 솔루션을 찾고 있습니다. 내가 것

+2

'run3'과 함께 사용하는 코드를 표시하고 작동하지 않는 코드를 정확히 설명하지 않는 이유는 무엇입니까? – Mat

+0

추가 세부 정보가 추가되었습니다. – Clinton

+0

'명령 입력 '의 끝에'\ n'을 사용하고 있습니까? – Barmar

답변

0

: 원하는 FH의에

  1. 리디렉션 STD *.
  2. 실행 system($cmd);
  3. STD *를 원래 상태로 복원하십시오.

    https://stackoverflow.com/a/1720592/1485996

    또한 STD 복원을 피하기 위해 local을 사용할 수 있습니다 :

자세한 방법에 대한 하리의 예에서보세요.

+0

'open ($ fh, "| $ cmd")'을 사용할 때처럼'cmd's 입력에 직접'print' 할 수있는 예를 보여줄 수 있습니까? – Clinton