ProgrammazioneData Engineer

Quali sono i dettagli da considerare nell'uso di assegnazioni scalari e di lista per array e hash in Perl? Come evitare errori comuni nella manipolazione delle strutture dati?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In Perl, il risultato dell'assegnazione (e quindi dell'operare con array e hash) dipende dal contesto.

  • L'assegnazione scalare di un array restituisce la dimensione dell'array.
  • L'assegnazione di lista restituisce tutti gli elementi.
my @arr = (10, 20, 30); my $count = @arr; # $count == 3 my ($first, $second) = @arr; # $first == 10, $second == 20

Per gli hash:

  • L'assegnazione di un hash a una lista crea un array chiave/valore.
  • L'assegnazione scalare di un hash restituisce una rappresentazione errata ("dimensione dell'hash") — ma non semplicemente il numero delle coppie!
my %h = (a=>1, b=>2, c=>3); my $size = %h; # $size == 3 nelle versioni moderne di Perl, ma prima non era così!

Fai attenzione a non assegnare un riferimento intero a un array invece di copiare il contenuto!

Domanda trabocchetto

Di cosa differisce l'assegnazione di un array a un riferimento e la copia del contenuto di un array?

Risposta:

my @a = (1,2,3); my $ref = \@a; # $ref — riferimento all'array, le modifiche tramite $ref sono visibili in @a my @b = @a; # @b — nuovo array, le modifiche a @b non influiscono a @a # Confronta: push @$ref, 4; # @a ora è (1,2,3,4) push @b, 5; # @a rimane (1,2,3,4); @b — (1,2,3,5)

Esempi di errori reali a causa della mancanza di conoscenza delle sfumature dell'argomento


Storia 1

Nel progetto, hanno passato un array a una sottoprogramma tramite riferimento, non capendo che si trattava proprio di un riferimento: la funzione lo ha modificato nel punto di chiamata. Sono arrivate delle bug — nel codice chiamante la struttura dati era già "danneggiata". Si aspettava una copia, si è ottenuto un alias.


Storia 2

Un ingegnere pensava che l'assegnazione scalare di %h avrebbe restituito il reale numero delle coppie. Si è scoperto che nelle versioni precedenti di Perl questo comportamento era diverso: restituiva il numero di slot/bucket, non la lunghezza! Di conseguenza, a volte restituiva non 3, ma un altro numero, il che ha rotto le statistiche.


Storia 3

In un grande sistema ETL, gli array venivano copiati tramite riferimenti, e poi inaspettatamente sovrascrivevano i dati l'uno dell'altro, perché tutti lavoravano con lo stesso array e non con copie indipendenti. La diagnosi dell'errore ha richiesto diversi giorni.