Corso di Perl

Array associativi III

 

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 dell’array, 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!). L’istruzione delete vi rende molto facile:

delete $array{“chiave”};

Perciò basterà scrivere questo:

delete $altezza{“Mario”};

e la coppia con la chiave “Mario” sparisce dall’array. 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 dell’utente, e anche riguardo all’utente stesso (o meglio, riguardo al suo computer).
Nel Perl ci sono altri array speciali, associativi e non. Un’occhiata 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