2011-11-07 9 views
5

Mi piacerebbe che perl -cw ... restituisca uno stato di uscita diverso da zero se viene emesso un avviso di compilazione.imposta lo stato di uscita se perl -cw emette un avviso

E.g. supponiamo a.pm è il file:

use warnings; 
asd; 

Poi perl -cw a.pm rapporti:

Unquoted string "asd" may clash ... 
Useless use of a constant in void context ... 
a.pm syntax OK 

e lo stato di uscita è impostato a 0. Mi piacerebbe essere in grado di rilevare che le avvertenze di compilazione sono state emesse - preferibilmente, ma impostazione dello stato di uscita.

risposta

7

Impostare un gestore di avvertimento in un blocco BEGIN (vicino alla parte superiore dello script, quindi questo blocco viene analizzato prima del codice che potrebbe innescare compile-time avvisi), e modificare lo stato di uscita in un END CHECK blocco.

use strict; 
use warnings; 
my $warnings; 
BEGIN { 
    $SIG{__WARN__} = sub { $warnings++; CORE::warn @_ } 
} 
$used::only::once = 42; 
CHECK { 
    if ($^C && $warnings > 0) { 
     exit $warnings; 
    } 
} 

La variabile $^C è vero se e solo se è stato invocato perl con l'opzione -c.

+0

Nella modalità di controllo della sintassi il blocco END non viene richiamato. Puoi controllare molto facilmente: 'perl -c -e'END {print" End block \ n "} ''. Se lo fosse - potremmo usare solo un pragma personalizzato per contare gli avvisi e modificare lo stato di uscita – yko

+0

@ yko - Scusa, ho interpretato male la parte sull'uso di '-c' all'inizio. Risolto ora. – mob

+0

@mob: È molto bello! – JRFerguson

5

Per quanto ne so, questo non è possibile. Dopotutto, si tratta solo di avvisi di consulenza non strettamente (no pun intended) errori. Inversamente, tuttavia, è possibile promuovere gli avvertimenti in caso di errori irreversibili in fase di esecuzione se ciò aiuta ad indirizzare il proprio obiettivo.

$ perl -M'warnings FATAL=>q(all)' -cw a.pm ; echo $? 
Unquoted string "asd" may clash with future reserved word at a.pm line 2. 
255 
+0

Funziona? Non riesco a riprodurre con avvisi e stato di uscita> 0 – yko

+0

@yko: Sì, funziona. Provalo con lo script originale dell'OP. – JRFerguson

+0

sì, questo funziona, mi dispiace – yko

2

Per ottenere questo comportamento è possibile utilizzare $SIG{__WARN__} per morire dopo il primo avviso. Proprio come questo:

package warncounter; 

use strict; 
use warnings; 

my $warnings; 

BEGIN { 
    $SIG{__WARN__} = sub { 
     $warnings++; 
     CORE::warn(@_); 
     exit(255); 
    }; 
} 

1; 

E allora si può eseguire il controllo della sintassi come

perl -Mwarncounter -wc test.pl 

Ma allora Perl uscire a destra dopo il primo avvertimento. La mia prima idea era di contare il numero di avvisi e impostare lo stato di uscita nel blocco END, ma in modalità di controllo della sintassi non veniva invocato il blocco END -c END.

Problemi correlati