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.