Restituisce un valore Booleano, che indica se ESPR ha un valore
diverso dal valore indefinito undef. Se ESPR non è
presente, il controllo viene fatto su $_.
Molte operazioni restituiscono undef per indicare l'insuccesso,
la fine del file, un errore di sistema, una variabile non
inizializzata, ed altre condizioni eccezionali. (Un semplice test
Booleano non è in grado di distinguere tra undef, zero,
la stringa vuota, e "0", che sono tutti ugualmente falsi). Va
notato che, poiché undef è uno scalare valido,
la sua presenza non indica necessariamente una condizione
eccezionale: pop restituisce undef guardo il suo argomento
è un array vuoto, oppure quando l'elemento da restituire
è esso stesso undef.
Potete anche usare defined(&pippo) per controllare se una
subroutine &pippo è stata definita in precedenza. Il
valore restituito non è variato da eventuali future
dichiarazioni di &pippo. Va notato che un subroutine non
definita può ancora essere chiamabile: il suo package
può avere un metodo AUTOLOAD che ne provoca l'esistenza
la prima volta che viene chiamata, consultate perlsub.
L'uso di defined su strutture (hash ed array) è deprecato.
Indicava quanta memoria era stata allocata per una determinata
struttura. Questa caratteristica potrebbe scomparire nelle future
versione di Perl. Al suo posto, fareste meglio ad usare un semplice
test di dimensione:
if (@un_array) { print "l'array contiene elementi\n" }
if (%un_hash) { print "l'hash contiene membri\n" }
Quando utilizzato su un elemento di un hash, defined vi dice se
quel valore è definito o meno, non se esiste o meno la
chiave nell'hash. Usate exists se vi interessa la seconda
informazione.
Esempi:
print if defined $switch{'D'};
print "$val\n" while defined($val = pop(@ary));
die "Non posso leggere il link $sym: $!"
unless defined($valore = readlink $sym);
sub pippo { defined &pluto ? &$pluto(@_) : die "Non esiste pluto"; }
$debugging = 0 unless defined $debugging;
Nota: Molta gente tende ad abusare di defined, e poi si
sorprende di scoprire che il numero 0 e "" (la stringa di
lunghezza zero) sono, in realtà, valori definiti. Per
esempio, se scrivete:
"ab" =~ /a(.*)b/;
La ricerca del pattern ha successo, e $1 risulta definito,
nonostante esso abbia trovato "nulla". Non è che non ha
veramente trovato nulla. Piuttosto, ha trovato qualcosa che era
lungo zero caratteri. Tutto ciò è piuttosto chiaro
e corretto. Quando una funzione restituisce un valore indefinito,
ammette di non essere in grado di fornire una risposta corretta.
Quindi dovreste usare defined solo quando dubitate
dell'integrità di ciò che state tentando di fare.
Nelle altre circostanze, una semplice comparazione on 0 o ""
è ciò che desiderate.