In Perl, il risultato dell'assegnazione (e quindi dell'operare con array e hash) dipende dal contesto.
my @arr = (10, 20, 30); my $count = @arr; # $count == 3 my ($first, $second) = @arr; # $first == 10, $second == 20
Per gli hash:
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!
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)
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
%havrebbe 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.