L'operatore defined in Perl verifica se un valore è definito (non è undef). È importante distinguere:
defined($x) restituirà true se $x non è uguale a undef (indipendentemente dal valore, anche se è una stringa vuota o 0).defined($hash{$key}) verifica se il valore dell'elemento è definito, ma non garantisce che la chiave stessa esista.defined($array[$i]) — analogamente, l'elemento può essere definito, ma l'array può essere più lungo o più corto.exists.Esempio:
my %h = (a => undef); if (exists $h{a}) { print "La chiave 'a' esiste "; } if (defined $h{a}) { print "La chiave 'a' è definita "; } else { print "La chiave 'a' non è definita "; }
Risultato:
La chiave 'a' esiste
La chiave 'a' non è definita
Qual è la differenza tra
exists $hash{$key}edefined $hash{$key}e quando il controllo su defined per un hash darà un risultato inaspettato?
Risposta: defined $hash{$key} verifica il valore, ma se la chiave non esiste, restituirà un valore non definito. Se la chiave esiste, ma il suo valore è undef, defined restituirà false. Ma se la chiave non esiste — anche false. Pertanto, per controllare l'esistenza di una chiave, usa sempre exists.
Esempio:
my %h = (foo => undef); if (defined $h{foo}) { ... } # false if (exists $h{foo}) { ... } # true
Storia
In un progetto, controllavano il flag "prontezza" come
defined($status{$id}), e se il valore era undef, consideravano il compito non elaborato. Tuttavia, le chiavi con undef erano valide, e non c'era verifica su exists — come conseguenza, parte dei dati elaborati veniva riavviata.
Storia
Un programmatore, importando dati da un file, confrontava le stringhe in questo modo:
if (defined $line && $line ne ''). Problema: a volte $line poteva essere una stringa nulla '0'. Tale stringa non è vuota, ma il confronto con defined (invece di controllare ne '') portava alla perdita di queste stringhe.
Storia
In un grande script Perl, che lavorava con hash, l'unica verifica dell'esistenza di un elemento era defined — di conseguenza, per le chiavi con valore undef si presentavano bug e dati mancanti nei report.