ProgrammazioneSviluppatore Backend Perl, Data Engineer (Perl), Fullstack Perl

Quali sono le insidie nell'uso dell'operatore defined e come verificare correttamente l'esistenza e la non-vuotezza del valore in diversi tipi di variabili in Perl?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

L'operatore defined in Perl verifica se un valore è definito (non è undef). È importante distinguere:

  • Per uno scalare: defined($x) restituirà true se $x non è uguale a undef (indipendentemente dal valore, anche se è una stringa vuota o 0).
  • Per un hash: defined($hash{$key}) verifica se il valore dell'elemento è definito, ma non garantisce che la chiave stessa esista.
  • Per un array: defined($array[$i]) — analogamente, l'elemento può essere definito, ma l'array può essere più lungo o più corto.
  • Per determinare l'esistenza di una chiave in un hash si usa 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

Domanda ingannevole.

Qual è la differenza tra exists $hash{$key} e defined $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

Esempi di errori reali dovuti alla mancanza di conoscenza delle sottigliezze dell'argomento.


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.