discorso sugli array associativi. Per riprendere il filo, riporto
qui larray 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 lelenco 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ò unistruzione 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 nellarray @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 listruzione non sia ovvia e non ci siano problemi
di leggibilità.
Andiamo avanti. Come keys() produce lelenco delle chiavi
di un array associativo, values() produce lelenco 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
allarray, cioè dopo lultimo 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 nellarray 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 dellarray.
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 dellarray. Potremmo scrivere il
tutto in una riga, se conoscessimo le istruzioni Perl giuste, ma
poiché siamo ancora allinizio del corso abbiamo una scelta
limitata. Questo mi dà la scusa per introdurvi listruzione
each():
($chiave, $valore) = each( %array);
each() ci fa vedere larray associativo una coppia
alla volta: alla sua prima esecuzione, ritorna un array composto
da due membri: la chiave e il valore della prima coppia dellarray
associativo. La volta seguente, ritorna la chiave e il valore della
coppia seguente, e così via fino al termine dellarray associativo.
Se viene chiamata una volta in più, each() ritorna un array vuoto,
e quindi ricomincia dallinizio dellarray associativo.
Vedremo nella lezione 11 come usarla in modo concreto.
Torna all'indice Generale del corso di Corso di Perl di Software Planet