Perl: Capturando o valor de retorno correto do comando 'system'

Sou iniciante em Perl. Eu tenho um script em lotes do Windows que contém vários comandos NMake. Um problema existente com esse script em lote é que mesmo que o comando NMake falhe durante sua execução,ERRORLEVEL não é definido corretamente.

Portanto, nunca sabemos se o comando funcionou até analisarmos o arquivo de log. Eu olhei para ele, mas não consegui encontrar uma solução. Eu, então, pensei em converter esse script em lote em um script Perl supondo que o erro de trapping seria mais fácil, mas parece que não é tão fácil :)

Sempre que executo meu script Perl, o comando 'system' sempre retorna 0. Examinei muitos links diferentes e percebi que capturar o status de retorno correto do comando 'system' não é tão simples. Ainda assim, tentei as sugestões, mas as coisas não estão funcionando. :(

Deixe-me mencionar que o comando NMake que é chamado, por sua vez, chama muitos comandos diferentes durante sua execução. Por exemplo, a saída de comando mencionada abaixo, que está emitindo 'erro fatal', é na verdade parte de um script Perl (check_dir.pl). Essa chamada para o script Perl é gravada no próprio arquivo NMake.

Se eu chamar esse arquivo Perl (check_dir.pl) diretamente e verifique o valor de saída, obtenho resultado correto, ou seja, o comando falha e imprimediferente de zero valor de saída (...retornou inesperadamente o valor de saída 2).

Tentei a função do sistema Perl, mas não ajudou. Eu usei o seguinte código:

<code>system ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1");

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

Saída:

.....  
.....  
Unable to open dir: R:\TSM_Latest  
Compressing...NMAKE : fatal error U1077: 'if' : return code '0x2'  
Stop.  
child exited with value 0

Também tentei:

<code>use IPC::System::Simple qw(system);  
my $exit_status = system ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1");

if ($exit_status != 0) {  
    print "Failure";  
    exit 3;  
} else {  
    print "Success";  
}
</code>

Finalmente tentei o seguinte módulo:

<code>use IPC::Run qw( run timeout );  
run "nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1" or die "NMake returned $?";
</code>

Nada parece estar funcionando :(

Por favor, corrija-me se eu estou interpretando o valor de retorno desystem incorretamente.

questionAnswers(1)

yourAnswerToTheQuestion