(risposta fornita da brian d foy, <bdfoy@cpan.org>
Quando eseguite uno script Perl, qualcos'altro sta eseguendo lo script per voi e
questo qualcos'altro potrebbe dare in output dei messaggi d'errore. Lo script
potrebbe emettere i propri avvertimenti e messaggi d'errore. Per la maggior
parte del tempo non potrete distinguere chi sta dicendo cosa.
Probabilmente non potete mettere a posto la cosa che esegue il per ma
potete cambiare come il perl manda in output i suoi avvertimenti definendo delle
funzioni warning e die su misura.
Considerate questo script che ha un errore che potreste non notare immediatamente.
#!/usr/locl/bin/perl
print "Ciao Mondo\n";
Ho ottenuto un errore quando l'ho eseguito dalla shell (si dà il caso sia bash).
Potrebbe sembrare che il perl abbia dimenticato di avere una funzione print(), ma la mia
shebang non è il percorso al perl, dunque la shell esegue lo script ed ottengo
l'errore.
$ ./test
./test: line 3: print: command not found
[./test: linea3: print: comando non trovato, NdT]
Una correzione alla buona implica un po' di codice, ma questo potrebbe essere
tutto quello che vi occorre per risolvere il problema.
#!/usr/bin/perl -w
BEGIN {
$SIG{__WARN__} = sub{ print STDERR "Perl: ", @_; };
$SIG{__DIE__} = sub{ print STDERR "Perl: ", @_; exit 1};
}
$a = 1 + undef;
$x / 0;
__END__
Il messaggio perl viene fuori con davanti "Perl". Il blocco BEGIN
funziona a tempo di compilazione cosicché anche tutti gli errori di compilazione e i
warning ottengano il prefisso "Perl:".
Perl: Useless use of division (/) in void context at ./test line 9.
Perl: Name "main::a" used only once: possible typo at ./test line 8.
Perl: Name "main::x" used only once: possible typo at ./test line 9.
Perl: Use of uninitialized value in addition (+) at ./test line 8.
Perl: Use of uninitialized value in division (/) at ./test line 9.
Perl: Illegal division by zero at ./test line 9.
Perl: Illegal division by zero at -e line 3.
[
Perl: Utilizzo inutile della divisione (/) in un contesto vuoto in ./test alla linea 9.
Perl: Nome "main::a" usato solo una volta: possibile errore di battitura in ./test alla linea 8.
Perl: Nome "main::x" usato solo una volta: possibile errore di battitura in ./test alla linea 9.
Perl: Uso di un valore non inizializzato nell'addizione (+) in ./test alla linea 8.
Perl: Uso di un valore non inizializzato nella divisione (/) in ./test alla linea 9.
Perl: Divisione per zero illegale in ./test alla linea 9.
Perl: Divisione per zero illegale in ./test alla linea 3.
,NdT]
Se non vedete quel "Perl:", non viene dal perl.
Potreste anche conoscere proprio tutti gli errori del perl e benché
ci sia qualcuno che potrebbe conoscerli tutti, probabilmente voi no. Ad ogni modo,
dovrebbero essere tutti nella manpage perldiag. Se non vi trovate l'errore,
probabilmente non è un errore del perl.
Cercare ogni messaggio non è la maniera più semplice, dunque lasciate
che il perl lo faccia per voi. Usate la direttiva diagnostics che converte i normali
messaggi del per in lunghe discussioni sull'argomento.
use diagnostics;
Se non ottenete un paragrafo o due due di un'ampia discussione, potrebbe non essere
stato un messaggio del perl.
|