2011-08-04 2 views
0

이 perl 스크립트의 목적은 먼저 .cpp 파일을 리팩터링 한 다음 전체 패키지를 컴파일하는 것입니다. 모두 잘되면 다음 파일로 이동하고 그렇지 않으면 backup 디렉토리의 원본 파일을 바꿉니다. 다음은 패키지의 makefile을 실행하기위한 펄 스크립트입니다.`make '오류를 잡는 중 문제가 발생했습니다

@lcpp = `ls *.cpp`; 
chomp(@lcpp); 
foreach (@lcpp) { 
print "processing file $_ ..."; 
`cp demac_dir/$_ .`; 
if(2 == `make`) { 
    print "\n\t\t\tError in the file\n"; 
    `cp backup/$_ .`; 
    print "reverting back to the original file and building the package again"; 
    `make`; 
} 
else {#when successfully compiled 
    print "successfully compiled the package with file $_"; 
} 
} 

컴파일러 오류가있는 '리팩터링 된'파일이 생길 때까지 스크립트가 실행됩니다. 스크립트가 make에 의해 반환 된 오류를 캡처 할 수 없습니다. 또는 나는 뭔가를 놓친다.

+0

왜 역 따옴표 그냥 부르지 ['system'] (http://perldoc.perl.org/functions/system.html)? –

+0

ok ... 나는 지금 system()을 시도하고있다. –

+0

이 많은 시스템 호출로 perl을 사용하는 것이 과잉이라고 생각된다. 첫 번째 라인을'my @lcpp = glob "* .cpp";'로 바꾸면, chomp를 할 필요없이 멋진 배열을 얻을 수 있습니다. [File :: Copy] (http://search.cpan.org/perldoc?File::Copy)는 복사/이동 명령입니다. 나는 거기에 뭔가 좋은 걸로 의심합니다. – TLP

답변

1

system()을 사용하여 make를 호출하면 make가 성공했는지 여부를 확인할 수 있습니다. perldoc -f system 참조 :

 
    @args = ("command", "arg1", "arg2"); 
    system(@args) == 0 
     or die "system @args failed: $?" 

You can check all the failure possibilities by inspecting $? 
like this: 

    if ($? == -1) { 
     print "failed to execute: $!\n"; 
    } 
    elsif ($? & 127) { 
     printf "child died with signal %d, %s coredump\n", 
      ($? & 127), ($? & 128) ? 'with' : 'without'; 
    } 
    else { 
     printf "child exited with value %d\n", $? >> 8; 
    } 

+0

지금 시스템()을 시도하고있다 ... 어떻게 가는지 보자 ... 제안 덕분에 –

+0

예 system() function 멋지게 작동합니다 ... 3 ~ 4 시간 전에 ... 물어 봤어야했는데 ... 고마워. –

+1

[Teach IPC :: System :: Simple] (http://stackoverflow.com/q/3477916#3478060) – daxim

2

거의 확실하게 오류는 STDERR로 이동합니다. STDERR은 백틱에 캡처되지 않습니다. 두 출력 스트림을 모두 쉽게 캡처하려면 Capture::Tiny을 사용하십시오.

+0

나는 make가 실패 할 경우 스크립트가 '알아야'하고 필요한 작업을 수행하기를 원한다. 예, 오류 메시지가 'stderr'로 바뀝니다. –

+0

@ Aditya Kumar - 어떤 오류가 발생했는지 확인하기 위해 출력을 파싱하고 싶습니다. 성공이 필요한 경우 '$?'를 확인하는 것이 가장 빠른 방법입니다. – bvr

+0

그래, 그걸 사용하려고 @RedGrittyBrick의 게시물을 보았다 ... –

관련 문제