Corso di Perl

Gli array associativi

 

Gli array scalari, come abbiamo visto, possono essere utili per molti compiti, ma hanno un difetto: una volta inserito un dato nell’array, occorre sapere il suo indice per ritrovarlo. Senza indice, il dato è virtualmente perso (ci sono eccezioni, ma qui non ci riguardano). Gli array associativi risolvono questo problema, assegnando ad ogni dato non un indice numerico progressivo, ma una chiave, in genere una stringa. Il dato poi può essere ritrovato usando la chiave. Ad esempio:

%stipendi = ();
$stipendi{“Mario Rossi”} = 1000;
$stipendi{“Marco Verdi”} = 2000;

Abbiamo qui ancora un altro simbolo, “%”, per indicare gli array associativi. Come prima, definiamo l’array %stipendi dandogli una lista vuota. Però, per accedere ai singoli elementi usiamo una chiave, messa tra parentesi graffe (nel caso non abbiate le parentesi graffe sulla vostra tastiera, potete farle tenendo premuto il tasto ALT e digitando 123 oppure 125 sul vostro tastierino numerico).
In questo modo, per conoscere lo stipendio di un dipendente basta avere il suo nome.

Da notare che ad ogni chiave è associato uno ed un solo valore, ma lo stesso valore può essere associato a più chiavi; questo concetto è nella definizione propria di chiave. In pratica quindi se si hanno due chiavi diverse, i due valori corrispondenti associati  possono essere o meno diversi, se invece si hanno due chiavi uguali i loro valori associati sono sicuramente uguali.

Gli array associativi sono utilissimi per organizzare le informazioni in modo logico. Mettiamo che, a scuola, vi abbiano dato come compito da svolgere a casa di fare un po’ di analisi statistiche sulle altezze dei vostri compagni di classe. Ok, difficilmente troveremo un quattordicenne in grado fare il tutto in Perl, ma immedesimatevi nella situazione.

Riempire un array associativo

Iniziamo il nostro programma fornendo i nomi dei ragazzi e le loro altezze. Per semplificare, mi limiterò ad una classe di 4 componenti (magari il nostro sistema scolastico se lo potesse permettere!).
Per riempire l’array, abbiamo più di un modo di farlo. Il più diretto è quello di dare le coppie chiave-valore una alla volta:

%altezza = ();
$altezza{“Marco”} = 168;
$altezza{“Mario”} = 179;
$altezza{“Luisa”} = 163;
$altezza{“Elena”} = 167;

In questo modo il nostro array contiene quattro chiavi, ad ognuna delle quali è associato un valore. L’assegnazione iniziale svuota l’array di un eventuale precedente contenuto (se siamo all’inizio di un programma non ci dovrebbe essere niente, ma è sempre meglio essere cauti).

La stessa operazione può essere scritta in modo più compatto:

%altezza =  (“Marco”, 168, “Mario”, 179, “Luisa”, 163, “Elena”, 167);

In quest’altro modo mettiamo le coppie in una lista. Il Perl vede che a sinistra dell’uguale c’è un array associativo, e spezza la lista in coppie chiave-valore. Fate attenzione a non usare un array normale (@)! Non funzionerebbe niente.
Da notare che assegnando direttamente una lista, non occorre svuotare l’array prima: dando una lista specifichiamo l’intero array.

C’è un terzo modo, più chiaro:

%altezza = (                Marco => 168,
                                Mario => 179,
                                Luisa => 163,
                                Elena => 167,
                                );

Qui abbiamo usato l’operatore “=>”, che è semplicemente un sostituto della virgola, solo che permette di organizzare visualmente le cose in “blocchi” logici. Notate che dopo l’ultimo valore, ho lasciato una virgola. In linguaggi più pignoli, questo sarebbe un errore, perché dopo la virgola c’è la parentesi di chiusura della lista. Il Perl è comunque coerente con se stesso: dopo la virgola c’è…

niente, quindi non aggiunge niente alla lista, poi trova la parentesi che la termina e considera la lista finita. In definitiva, la virgola è ininfluente. Ma può fare molta differenza quando andate ad aggiungere altri valori oltre a quelli già scritti, e potreste fare questo errore:

%altezza = (                Marco => 168,
                                Mario => 179,
                                Luisa => 163,
                                Elena => 167
                                Paolo => 162,
                                );


Anche se a voi tutto sembra ben separato, in realtà tra il “167” di Elena e il nome di Paolo c’è solo un ritorno a capo, che dal punto di vista sintattico non basta a separare le cose. Quindi, usate sempre le virgole, e sarete al sicuro.

Termina qui la prima lezione sugli array associativi. Conservate il programma che stiamo scrivendo, perché servirà anche nella prossima lezione.

 

Torna all'indice Generale del corso di Corso di Perl di Software Planet