2014-02-24 3 views
-1

나는 명령을 실행하고 your id is <895162>과 같은 출력을 얻는 perl 스크립트로 작업 중입니다. 이 문자열을 저장하고이 문자열에서만 숫자를 읽습니다. 문제는 내 기본 명령이 펄에서 시스템 명령을 사용하여 쉘에서 실행된다는 것입니다. 같은출력을 복사하고 perl에서 번호를 추출하십시오.

:

#ids.csh is "echo your id is <1123221>" 
my $p = system ("./ids.csh 2>&1 > /dev/null"); 
print "$p\n"; 
$p =~ s/[^0-9]//g; 

하지만 출력이 어디에서 잘못 가고,은 $ P 파일에 복사되지 않는 이유는 무엇입니까?

답변

2

system 명령을 실행 하나 캡처하지 않습니다. 렌 제피, 당신은 아마 표준 출력 (오히려 표준 오류가가는 곳마다 화면 또는로 표시보다) 표준 에러 출력을 버리고 싶어하지만 말했듯이

my $p = `./ids.csh 2>/dev/null`; 

(즉 : 그 들어, qx/역 따옴표를 원한다 캡처하려는 메시지가 포함되어 있음).

qx가 실패하면 몇 가지 다른 이유로 그렇게 할 수 있으며 의미있는 오류 메시지를 구성하는 것은 쉽지 않습니다. 문제가 발생하면 대신 IPC::System::Simple 님의 capture()를 사용하는 것이 좋습니다.

+0

이제이 명령은 출력으로'./ids.csh 2>/dev/null'을 출력하고, 시스템을 사용해 보았을 때 에코 라인을 인쇄하고 있지만 인쇄하지 않으면 $ p와 $ p 값을 복사하지 않습니다. . – user2828488

+1

그런 다음 역 따옴표를 사용하지 않고 작은 따옴표를 사용했습니다. backticks는 일반적으로 물결표 ~와 같은 키보드의 동일한 키에 있습니다. 또는'my $ p = qx! ./ ids.csh 2>/dev/null!;'(qx를 명시 적으로 지정하면 원하는 구분 기호를 선택할 수 있습니다)를 수행 할 수 있습니다. – ysth

2

모든 출력을 /dev/null으로 리디렉션했습니다. 즉, 모든 출력이 삭제됩니다.

나는 당신이 아마 의미 생각 : 변경 표준 출력을 유지하면서

./ids.csh 2>/dev/null 

는/dev/null로 표준 오류를 리디렉션합니다 어느.

+0

감사합니다.하지만 결과를 $ p에 저장하고 싶습니다. 내 ids.csh에 내 이름이 toby1234입니다. "그래서이 파일을 실행할 때 내 이름은 toby1234입니다. '나는 이것을 $ p에 저장하고 나서 그것으로부터 숫자를 추출 할 것입니다. 나쁜 설명 죄송합니다. – user2828488

+1

출력 내용을/dev/null로 리디렉션하면 echo() 문 결과가 전혀 표시되지 않습니다. –

관련 문제