ProgrammierungPerl Backend-Entwickler, Data Engineer (Perl), Perl Fullstack

Welche Fallstricke gibt es bei der Verwendung des Operators defined und wie überprüft man richtig, ob Werte in verschiedenen Variablentypen in Perl existieren und nicht leer sind?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

Der Operator defined in Perl überprüft, ob ein Wert definiert ist (ob er nicht undef ist). Es ist wichtig zu unterscheiden:

  • Für Skalare: defined($x) gibt true zurück, wenn $x nicht undef ist (unabhängig vom Wert, selbst wenn es eine leere Zeichenkette oder 0 ist).
  • Für Hashes: defined($hash{$key}) überprüft, ob der Wert des Elements definiert ist, garantiert jedoch nicht, dass der Schlüssel selbst existiert.
  • Für Arrays: defined($array[$i]) — ähnlich, das Element kann definiert sein, aber das Array kann länger oder kürzer sein.
  • Um die Existenz eines Schlüssels in einem Hash zu überprüfen, verwendet man 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

Fangfrage.

Was ist der Unterschied zwischen exists $hash{$key} und defined $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

Beispiele für echte Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


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.