2012-01-01 3 views
0

나는이 perl 코드를 아래에 가지고있다. 기본적으로이 두 파일을 반복하고 싶다. 그런 다음 bash 스크립트 (파일과 구분 기호를 인수로 사용하고 여러 행을 출력 함)를 호출 한 다음 해당 명령의 모든 출력을 새 파일에 저장합니다 (파일 이름 끝에 '_processed'가 붙음). 아래 구문에 무엇이 잘못 되었습니까 (지금은 빈 파일을 만듭니 까?).perl - 시스템 명령어를 파일로 리다이렉트

#!/usr/bin/env perl 
use strict; 
use warnings; 

my(@files) = (
"fixedtt.txt '|'", 
"delimd2iffpipe.dat '|'" 
); 
for my $i (0 .. $#files) { 
    my($filename) = split /[\s]+/, "$files[$i]", 2; 
    my($name, $type) = split /[\.]+/, "$filename", 2; 
    open (MYFILE, '>'."$name".'_processed.'."$type"); 
    system("sh myBashScript.sh $files[$i]"); #I want to write the entire output of this command to a file 
    close (MYFILE); 
} 
+0

왜 'MYFILE'을 열지 않고 닫으시겠습니까? 'system' 문이 그 파일에 쓰고 있다고 생각합니까? – TLP

답변

5

터미널 명령의 출력을 > <file name> 앞에 붙여서 리디렉션 할 수 있습니다. 인체 공학적 :

system("sh myBashScript.sh $files[$i]"); 

가된다 :

system("sh myBashScript.sh $files[$i] > file.txt"); 
1

당신은 펄이 파일에 기록하는 방법과 혼동 될 것으로 보인다. opencloseMYFILE 핸들에 비어있는 파일 만 만듭니다. system은 perl 내에서 그 파일에 아무 것도하지 않습니다. (비록 내가 당신의 쉬 스크립트가 그것으로 무엇을하는지 말할 수는 없지만).

일부 포인터 : 당신은 자신이 어디서나 사용되지 않는 인덱스 있기 때문에, 대신 아무 이유없이 가독성을 감소 요소의 @files의 인덱스를 사용하는

  • .
  • 파일 이름과 확장명을 추출하는 데 split을 사용하고 있으며 그 이유는 I 입니다. 그러나 LIMIT를 2로 설정하지 않아도됩니다.이 경우 첫 번째 또는 두 개의 요소 만 해당 분할에서 사용하기 때문입니다.
  • 문자가 하나 (문자 클래스가 예 : \s) 인 경우 대괄호는 필요하지 않습니다. 따라서 [\s] 대신 \s을 사용하십시오.
  • open에 어휘 파일 핸들을 사용하는 것이 좋습니다.
  • 출력 캡처 (표준 출력으로)는 backticks or qx()으로 완료됩니다. system은 시스템 호출의 반환 값만 반환합니다. dunsmoreb 셸에서 간단히 리디렉션하여 파일을 만들 수 있다는 것이 맞지만이 방법은 perl 내부에서 수행됩니다.

내가 생각한다면, 당신은 당신이해야하는 경우 열려고하는 파일의 bash는 스크립트의 출력, 작성하려고했다라고 말하고 싶지만 :

my @files = (
    "fixedtt.txt '|'", 
    "delimd2iffpipe.dat '|'" 
); 
for my $args (@files) { 
    my ($filename) = split ' ', $args; 
    $filename =~ s/\./_processed./; 
    open my $fh, '>', $filename or die $!; 
    print $fh qx(sh myBashScript.sh $args); 
    close $fh; 
} 
+0

+1 어떻게 작동하는지 설명해 주셔서 감사합니다. – toop

관련 문제