Der Operator defined in Perl überprüft, ob ein Wert definiert ist (ob er nicht undef ist). Es ist wichtig zu unterscheiden:
defined($x) gibt true zurück, wenn $x nicht undef ist (unabhängig vom Wert, selbst wenn es eine leere Zeichenkette oder 0 ist).defined($hash{$key}) überprüft, ob der Wert des Elements definiert ist, garantiert jedoch nicht, dass der Schlüssel selbst existiert.defined($array[$i]) — ähnlich, das Element kann definiert sein, aber das Array kann länger oder kürzer sein.exists.Beispiel:
my %h = (a => undef); if (exists $h{a}) { print "Schlüssel 'a' existiert "; } if (defined $h{a}) { print "Schlüssel 'a' ist definiert "; } else { print "Schlüssel 'a' nicht definiert "; }
Ergebnis:
Schlüssel 'a' existiert
Schlüssel 'a' nicht definiert
Was ist der Unterschied zwischen
exists $hash{$key}unddefined $hash{$key}und wann gibt die Prüfung auf defined für einen Hash unerwartete Ergebnisse zurück?
Antwort: defined $hash{$key} überprüft den Wert, aber wenn der Schlüssel nicht existiert, gibt es einen undefinierten Wert zurück. Wenn der Schlüssel existiert, aber sein Wert undef ist, gibt defined false zurück. Wenn der Schlüssel nicht existiert — ebenfalls false. Daher sollte man zur Überprüfung der Existenz eines Schlüssels immer exists verwenden.
Beispiel:
my %h = (foo => undef); if (defined $h{foo}) { ... } # false if (exists $h{foo}) { ... } # true
Geschichte
In einem Projekt wurde das Flag "Fertigkeitsstatus" als
defined($status{$id})überprüft, und wenn der Wert undef war, wurde die Aufgabe als nicht bearbeitet betrachtet. Allerdings waren Schlüssel mit undef gültig, und es gab keine Überprüfung auf exists — als Folge wurden einige bearbeitete Daten erneut gestartet.
Geschichte
Ein Programmierer, der Daten aus einer Datei importierte, verglich Zeichenfolgen so:
if (defined $line && $line ne ''). Das Problem: Manchmal konnte $line eine Null-Zeichenfolge '0' sein. Eine solche Zeichenfolge ist nicht leer, aber der Vergleich mit defined (anstatt die Prüfung ne '') führte zum Verlust dieser Zeilen.
Geschichte
In einem großen Perl-Skript, das mit Hashtabellen arbeitete, war die einzige Prüfung auf die Existenz eines Elements defined — in der Folge traten Fehler und fehlende Daten in Berichten bei Schlüsseln mit dem Wert undef auf.