ProgrammatiePerl Backend ontwikkelaar, Data Engineer (Perl), Perl Fullstack

Welke valkuilen zijn er bij het werken met de defined-operator en hoe controleer je op bestaan en niet-leegheid van waarden in verschillende types variabelen in Perl?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

De defined operator in Perl controleert of een waarde gedefinieerd is (niet undef is). Het is belangrijk om te onderscheiden:

  • Voor scalars: defined($x) retourneert true als $x niet gelijk is aan undef (ongeacht de waarde, zelfs als het een lege string of 0 is).
  • Voor een hash: defined($hash{$key}) controleert of de waarde van het element gedefinieerd is, maar garandeert niet dat de sleutel zelf bestaat.
  • Voor een array: defined($array[$i]) — vergelijkbaar, het element kan gedefinieerd zijn, maar de array kan langer of korter zijn.
  • Voor het controleren van het bestaan van een sleutel in een hash gebruik je 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

Vraag met een valstrik.

Wat is het verschil tussen exists $hash{$key} en defined $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

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp.


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.