Genera un messaggio sullo STDERR, esattamente come c<die>, ma non esce e non solleva un'eccezione.
Se LISTA è vuota e $@ contiene già un valore (solitamente derivante da
un precedente eval), tale valore viene utilizzato dopo aver concatenato "\t...caught" [preso, NdT]
a $@. Questo è utile per rimanere quasi, ma non del tutto, uguali a die.
Se $@ è vuota, allora viene utilizzata la stringa
"Warning: Something's wrong" ["Attenzione: Qualcosa è andato storto", NdT].
Se è stato installato un handler di $SIG{__WARN__}, non viene visualizzato
alcun messaggio. È compito dell'handler occuparsi del messaggio nella maniera che
ritene opportuna (ad esempio, convertendolo in una die). La maggior parte degli
handler devono quindi occuparsi di visualizzare i warning che non sono preparati a
gestire, chiamando warn di nuovo all'interno dell'handler stesso. Va notato che questa
è una procedure sicura, che non creerà un ciclo senza fine,
poiché gli hook a __WARN__ non vengono chiamati dall'interno di uno di essi.
Noterete che questo comportamento è in qualche modo diverso da quello degli
handler di $SIG{__DIE__} (che non sopprimono il testo di errore, ma possono invece
chiamare di nuovo die per cambiarli).
L'uso dell'handler __WARN__ fornisce un potente metodo per mettere a tacere tutti i
warning (anche quelli cosiddetti obbligatori). Ad esempio:
# cancella *tutti* i warning della compilazione
BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $FAIWARN } }
my $pippo = 10;
my $pippo = 20; # nessun warning sul my $pippo duplicato,
# ma ehi, lo avete chiesto voi!
# nessun warning di compilazione o esecuzione prima di questo punto
$FAIWARN = 1;
# warning di esecuzione abilitati dopo questo punto
warn "\$pippo e` vivo e $pippo!"; # viene mostrato
Consultate perlvar per dettagli sull'impostazione delle voci in %SIG, e per altri
esempi. Consultate il modulo Carp per altri tipi di warning che usano le sue funzioni
carp() e cluck().