Riprendiamo il discorso su each(). Riferendoci al programma delle
lezioni 9 e 10, possiamo calcolare la media delle altezze in questo
modo:
($nome, $a1) = each( %altezza);
($nome, $a2) = each( %altezza);
($nome, $a3) = each( %altezza);
($nome, $a4) = each( %altezza);
($nome, $a5) = each( %altezza);
$media = ($a1 + $a2 + $a3 + $a4 + $a5) / 5;
print Media: $media\n;
che è un è un granché esteticamente, e inoltre non è indipendente
dalla lunghezza dellarray, ma con le istruzioni che conosciamo
non ci possiamo permettere grandi cose. Faremo di meglio in seguito.
Per inciso, la variabile $nome non è usata, ma serve solo a tenere
il posto per costruire un array di 2 variabili.
Si può evitare la variabile aggiuntiva, calcolando la media in
questo modo:
$media = ( (each(%altezza))[1]
+ (each(%altezza))[1] + (each(%altezza))[1] + (each(%altezza))[1]
+ (each(%altezza))[1] ) / 5;
che è il risultato della tipica illeggibilità del Perl, se usato
male. Sapendo che each() ritorna un array di due elementi, il secondo
dei quali è il valore, dovreste essere in grado di capire cosa succede
in quella linea di codice
ma sarà meglio evitare di scrivere
complicazioni del genere.
Eliminazione
Mettiamo che Mario vi stia molto antipatico, e che lo vogliate togliere
di mezzo (dai conti, non sul serio!). Listruzione delete vi
rende molto facile:
delete $array{chiave};
Perciò basterà scrivere questo:
delete $altezza{Mario};
e la coppia con la chiave Mario sparisce dallarray.
Ovviamente, in mezzo alle parentesi quadre possiamo metterci una
qualunque istruzione il cui risultato sia una stringa.
La stessa istruzione può essere usata per svuotare completamente
un array associativo:
delete @altezza{ keys %altezza};
la logica di questa istruzione non è immediata, anche se a
naso potete già vedere che torna. La prima cosa che viene
eseguita, come nelle espressioni matematiche, è sempre nella parentesi
più interna. Quindi, keys %altezza produce un array
di tutte le chiavi contenute in %altezza. Questo array viene passato
a delete (ecco perché abbiamo scritto @altezza e non $altezza).
Trovandosi davanti ad un array, delete lo spezza in elementi singoli
e cancella le chiavi una alla volta.
In realtà, tutto ciò si traduce in uno spreco di tempo e processore.
Infatti la prima istruzione della lezione 9:
%altezza=();
ha esattamente lo stesso risultato, ed è molto più efficiente.
Un array speciale: %ENV
Ci sono array che sono già definiti fin dalla prima riga del vostro
programma. Tali array sono un modo del Perl di comunicarvi alcune
informazioni. Il più importante di questi è %ENV, che definisce
il vostro cosiddetto ambiente operativo (ENV è la contrazione
di environment, che in Inglese significa ambiente). In altre
parole, %ENV contiene una serie di coppie chiave-valore che forniscono
al vostro programma una serie di dati sul computer in cui gira.
Ad esempio, provate questo:
print $ENV{PATH};
Avrete come risultato il vostro path (percorso), cioè la
lista delle directory dove vengono cercati i comandi che immettete
nelle finestre DOS e nel comando Esegui del menù Avvio.
Potete dare anche uno sguardo a $ENV{TMP}, che vi dice
qual è la directory temporanea dove le varie applicazioni (e anche
il vostro programma, se necessario) possono mettere i files temporanei
necessari al loro funzionamento.
%ENV ha una grandissima importanza se i vostri script Perl devono
girare su un server web: è attraverso questo array che lo script
ricava tutte le informazioni riguardo alla richiesta dellutente,
e anche riguardo allutente stesso (o meglio, riguardo al suo
computer).
Nel Perl ci sono altri array speciali, associativi e non. Unocchiata
alla documentazione mostra che esistono @ARGV, @INC, %INC, %SIG.
Li incontreremo via via che si renderanno necessari.
Ormai sugli array associativi ne sappiamo abbastanza. Ci manca forse
un po di pratica, ma quella verrà da sola col tempo. Nella
prossima lezione introdurremo le strutture di controllo. Chi programma
sa già cosa vuol dire, e conosce la loro importanza fondamentale.
Chi inizia ora, avrà il gusto della scoperta :-)
Torna all'indice Generale del corso di Corso di Perl di Software Planet