-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[44] Come riconosco la differenza tra errori dalla shell e perl?

(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.

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google