De defined operator in Perl controleert of een waarde gedefinieerd is (niet undef is). Het is belangrijk om te onderscheiden:
defined($x) retourneert true als $x niet gelijk is aan undef (ongeacht de waarde, zelfs als het een lege string of 0 is).defined($hash{$key}) controleert of de waarde van het element gedefinieerd is, maar garandeert niet dat de sleutel zelf bestaat.defined($array[$i]) — vergelijkbaar, het element kan gedefinieerd zijn, maar de array kan langer of korter zijn.exists.Voorbeeld:
my %h = (a => undef); if (exists $h{a}) { print "Sleutel 'a' bestaat "; } if (defined $h{a}) { print "Sleutel 'a' is gedefinieerd "; } else { print "Sleutel 'a' niet gedefinieerd "; }
Resultaat:
Sleutel 'a' bestaat
Sleutel 'a' niet gedefinieerd
Wat is het verschil tussen
exists $hash{$key}endefined $hash{$key}en wanneer zal de check op defined voor een hash een onverwacht resultaat opleveren?
Antwoord: defined $hash{$key} controleert de waarde, maar als de sleutel niet bestaat, levert dit een ongedefinieerde waarde op. Als de sleutel bestaat, maar zijn waarde is undef, geeft defined false. Maar als de sleutel niet bestaat — ook false. Daarom gebruik altijd exists voor het controleren van het bestaan van een sleutel.
Voorbeeld:
my %h = (foo => undef); if (defined $h{foo}) { ... } # false if (exists $h{foo}) { ... } # true
Verhaal
In een project controleerde men de "gereed" vlag als
defined($status{$id}), en als de waarde undef was, beschouwde men de taak als niet verwerkt. Echter, sleutels met undef waren geldig, en er was geen bestaat check — als gevolg hiervan werden sommige verwerkte gegevens opnieuw uitgevoerd.
Verhaal
Een programmeur, die gegevens uit een bestand importeerde, vergeleek strings zo:
if (defined $line && $line ne ''). Probleem: soms kon $line een lege string '0' zijn. Zo’n string is niet leeg, maar de vergelijking met defined (in plaats van de check ne '') leidde tot het verlies van deze strings.
Verhaal
In een grote Perl-script, dat met hashes werkte, was de enige controle op het bestaan van een element defined — als gevolg daarvan ontstonden bugs en gemiste gegevens in de rapporten voor sleutels met de waarde undef.