Liste ed array associativi

Guida a Perl
di M. Liverani

Una lista in Perl è semplicemente un insieme ordinato di scalari. Una lista può contenere numeri, stringhe o anche un misto di entrambi questi tipi di dato. In effetti in Perl la differenza tra una lista ed un array è molto sottile, tanto che potremmo dire che se assegnamo un nome ad una lista ciò che otteniamo è un array. Più che altro la distinzione, ben marcata in altri linguaggi di programmazione, in Perl riguarda soprattutto il modo in cui vengono utilizzati certi insiemi di dati.

Una lista viene definita elencandone gli elementi, come, ad esempio:

('cani', 'gatti', 'cavalli', 'pesci')
(1, 2, 3, 4, 5, 47, 1.34, 12)

Come abbiamo già visto possiamo inizializzare un array con il contenuto di una lista con la seguente istruzione:

@animali = ('cani', 'gatti', 'cavalli', 'pesci');

Gli elementi di una lista possono essere ordinati alfabeticamente utilizzando l'istruzione sort; ad esempio, la seguente istruzione ci permette di ordinare il contenuto dell'array @animali appena definito:

@animali = sort @animali;

Cogliamo l'occasione per elencare tre importanti istruzioni che consentono di effettuare delle operazioni elementari sulle liste. L'istruzione shift restituisce il primo elemento della lista e lo elimina dalla lista stessa. L'operatore pop restituisce invece l'ultimo elemento della lista e lo elimina dalla lista. Infine l'operatore push inserisce un elemento al termine della lista.

Veniamo ora al tipo di dato più importante in Perl, gli array associativi; citando Larry Wall (l'autore del Perl) si può dire che se non si pensa in termini di array associativi non si sta pensando in Perl.

Un normale array ci permette di ``puntare'' ai suoi elementi usando numeri interi come indici. Un array associativo ci permette di fare la stessa cosa utilizzando delle stringhe come indici (o chiavi, in questo caso). Visto che spesso gli elementi dell'array sono stringhe, in questo modo possiamo associare tra loro coppie di stringhe: il dato vero e proprio e la chiave (o l'indice) che lo identifica all'interno dell'array.

Un array associativo è una lista di valori come ogni altro array, salvo che per il fatto che invece di indicizzare l'array mediante la posizione di ogni elemento, si indicizza ogni coppia di valori dell'array mediante il primo elemento della coppia.

Ad esempio supponiamo di voler tenere conto del numero di giorni di ogni mese dell'anno (supponiamo anche di non essere in un anno bisestile); il seguente programmino potrebbe aiutarci:

#!/usr/local/bin/perl
# giorni.pl: dato il nome di un mese ne stampa il
# numero di giorni
%giorni = ('gennaio', 31, 'febbraio', 28, 'marzo', 31, 'aprile', 30,
'maggio', 31, 'giugno', 30, 'luglio', 31, 'agosto', 31,
'settembre', 30, 'ottobre', 31, 'novembre', 30,
'dicembre', 31);
print "mese: ";
$mese = <STDIN>;
chop($mese);
print "$mese ha $giorni{$mese} giorni.\n";

In maggiore dettaglio possiamo dire che ci si riferisce ad un array associativo con il simbolo ``%'' (e non con la chiocciola ``@'', come per i normali array o le liste); il singolo elemento dell'array associativo (che, come al solito è uno scalare) è individuato dalla chiave associata; così il terzo elemento dell'array associativo definito nell'esempio precedente (31, il numero di giorni del mese di marzo) è individuato dall'espressione $giorni{'marzo'}.

La funzione chop usata dopo aver letto un input da file, serve ad eliminare il carattere di fine riga dalla variabile che contiene l'input (nel nostro caso la variabile $mese).

Osserviamo infine che la funzione keys() restituisce una lista con le chiavi dell'array associativo passato come argomento, in modo da consentirci di operare sugli elementi dell'array nell'ordine desiderato. La funzione values() effettua l'operazione complementare: restituisce una lista con i valori degli elementi dell'array associativo passato come argomento.

© Risorse.net (www.risorse.net)
pagina in versione stampabile:
http://www.risorse.net /perl/liste.asp?print=ok