Corso di Perl

Array associativi II

 

discorso sugli array associativi. Per riprendere il filo, riporto qui l’array associativo che abbiamo definito nella lezione precedente:

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


Chiavi e valori


Sfruttiamo ora questo array. Per prima cosa vogliamo che il nostro programma scriva l’elenco dei componenti della classe. Possiamo usare la funzione keys(), che estrae da un array associativo tutte le chiavi e le ritorna assemblate in un array.

Perciò un’istruzione come questa:

print keys( %altezza);

scriverà i nomi dei nostri compagni di classe. Se provate anche voi, noterete un piccolo particolare… i nomi vengono stampati tutti di seguito, senza alcuna interruzione.

Per migliorare il risultato estetico introduciamo la funzione join():

$risultato = join (“stringa”, @array);

Questa istruzione affianca (to join in Inglese significa unire) le singole stringhe contenute nell’array @array, unendole le une alle altre attraverso la “stringa” che è specificata. Ecco come usarla in modo costruttivo:

print “Membri della classe:\n”;
print join(“\n”, keys( %altezza));

Sappiamo che keys() produce un array. Le singole stringhe di questo array vengono unite con “n”, cioè con un ritorno a capo. E tutto finalmente diventa leggibile, a parte il nostro programma che, come spesso accade col Perl, diventa sempre più criptico e pieno di punteggiatura sparsa.
Notate ad esempio le doppie parentesi in fondo alla seconda istruzione. Ne servono due, perché sia join() che keys() hanno aperto una parentesi, e una parentesi aperta deve sempre essere richiusa. In realtà, le parentesi qui sono opzionali. Se scriviamo:

print join “n”, keys %altezza;

tutto funziona ugualmente, ma diventa più difficile capire cosa sta succedendo. Perciò vi suggerisco di usare sempre le parentesi, a meno che l’istruzione non sia ovvia e non ci siano problemi di leggibilità.

Andiamo avanti. Come keys() produce l’elenco delle chiavi di un array associativo, values() produce l’elenco dei valori. La possiamo usare in un modo del tutto simile:

print “\n”;
print “Elenco delle altezze:\n”;
print join(“\n”, values( %altezza));


Dovreste essere in grado di capire da soli cosa succede in queste due righe di codice, ma potreste chiedervi cosa ci sta a fare la prima istruzione print. Il fatto è che il join() usato in precedenza ha introdotto dei ritorni a capo dappertutto, tranne che in fondo all’array, cioè dopo l’ultimo nome. E se non ne aggiungiamo un altro, la scritta “Elenco delle altezze:” verrebbe appiccicata “Paolo”. Potevamo anche scrivere questo:

print “\nElenco delle altezze:\n”;


Ma sarebbe stato meno leggibile (non che questo sia un motivo che possa frenare un qualunque programmatore Perl che si rispetti…)

Quanto è lungo?

Sia keys() che values() sono in genere usate in un contesto array, come abbiamo fatto finora. Possono anche essere usate in un contesto scalare, e in tal caso ritornano il numero di chiavi o di valori (il che è lo stesso) presenti nell’array associativo:

print “\n”;
print “Numero di membri:\n”;
print scalar( keys( %altezza));

In sostanza, usare keys() o values() in un contesto scalare ci dà la lunghezza dell’array.

Esplorazione

Come operazione statistica principale, ci limitiamo ad una media (non è mica un corso di matematica, questo…).

Per fare una media, dobbiamo sommare tutte le altezze e poi dividere per il numero di elementi dell’array. Potremmo scrivere il tutto in una riga, se conoscessimo le istruzioni Perl giuste, ma poiché siamo ancora all’inizio del corso abbiamo una scelta limitata. Questo mi dà la scusa per introdurvi l’istruzione each():

($chiave, $valore) = each( %array);


each() ci fa “vedere” l’array associativo una coppia alla volta: alla sua prima esecuzione, ritorna un array composto da due membri: la chiave e il valore della prima coppia dell’array associativo. La volta seguente, ritorna la chiave e il valore della coppia seguente, e così via fino al termine dell’array associativo. Se viene chiamata una volta in più, each() ritorna un array vuoto, e quindi ricomincia dall’inizio dell’array associativo.
Vedremo nella lezione 11 come usarla in modo concreto.

 

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