Un array, chiamato a volte impropriamente lista, è un gruppo di valori scalari nel quale è mantenuto un indice sequenziale che permette al programmatore di memorizzare un valore in una determinata posizione e di leggerlo o modificarlo in un secondo momento. Poniamo di dover gestire nel nostro programma quattro nomi di persona; potremmo memorizzarli in altrettante variabili scalari:
$nome1 = 'Michele';
$nome2 = 'Elena';
$nome3 = 'Luca';
$nome4 = 'Elisa';
Questo sistema può anche andare bene se i nomi non sono moltissimi, ma in realtà si rivela già poco elegante se ne stiamo trattando più di due. Un array permette una gestione molto più comoda del tutto, e può essere inizializzato come segue:
@nomi = ('Michele', 'Elena', 'Luca', 'Elisa');
L'inizializzazione è un'operazione del tutto facoltativa, in quanto si possono direttamente inserire gli elementi nella posizione desiderata secondo la sintassi che vedremo tra poche righe. Se le stringhe prevedono solo caratteri alfanumerici è possibile anche utilizzare la cosiddetta quoted syntax:
@nomi = qw(Michele Elena Luca Elisa);
che permette di evitare di dover sempre scrivere gli apici. Questa soluzione non effettua tuttavia alcuna interpolazione, quindi se per inizializzare le stringhe utilizzate gli apici doppi poiché dovete inserire qualche carattere particolare o variabile, dovrete utilizzare qq in luogo di qw.
I due frammenti di codice appena visti creano un array di nome nomi con quattro elementi. L'identificatore che contraddistingue gli array è, diversamente dagli scalari al cui nome è anteposto il dollaro, la chiocciolina (@). A questo punto l'array può essere gestito in molti modi: se ad esempio vogliamo stamparne tutto il contenuto possiamo scrivere:
print @nomi;
Questo causerà la stampa dei vari elementi, nell'ordine in cui erano stati inseriti, senza alcun separatore; nel nostro caso l'output sarà quindi:
MicheleElenaLucaElisa
La cosa più utile è naturalmente gestire i vari elementi singolarmente. Ciò è molto semplice, in quanto ogni elemento può essere trattato come uno scalare. Quindi funzionano benissimo le seguenti istruzioni:
print $nomi[0];
$nomi[2] = 'Daniele';
La prima riga stampa il primo elemento dell'array (in Perl, come in molti altri linguaggi, l'indice di partenza è 0 e non 1), mentre la seconda cambia il valore del terzo elemento da Luca a Daniele. Come si nota, quando si gestiscono i singoli elementi non si antepone più la chiocciolina al nome dell'array, ma il dollaro: questo è perfettamente coerente, in quanto come detto ogni elemento viene trattato come uno scalare. Le parentesi quadre permettono di specificare l'indice (cioè la posizione) in cui è memorizzato l'elemento a cui interessa accedere. È anche possibile accedere a porzioni di array:
print @nomi[1,3];
print @nomi[1..3];
La prima istruzione stampa solo gli elementi di indice 1 e 3 dell'array: si può specificare un numero arbitrario di elementi separati da virgola. La seconda istruzione permette invece di stampare un intervallo, in questo caso quello che va dall'elemento 1 all'elemento 3, estremi compresi. Utilizzando le sintassi sopra descritte si possono anche creare nuovi array composti da parti o da tutto l'array originale, come nei seguenti esempi:
@nomi2 = @nomi; # Copia tutto @nomi in @nomi2
@nomi3 = @nomi[1,3]; # Copia gli elementi 1 e 3 in @nomi3
# (in cui diventano 0 e 1)
@nomi4 = @nomi[1..3]; # Copia gli elementi 1, 2 e 3 in @nomi4
# (in cui diventano 0, 1 e 2)
In molti casi è utile conoscere il numero di elementi di un array; è possibile procedere come segue:
print scalar(@nomi);
In contesto scalare una variabile di tipo array indica il numero di elementi in essa contenuti. La funzione print(), come si è visto prima, non cambia il contesto in scalare, e bisogna quindi ricorrere alla funzione scalar(). In altri ambiti il contesto viene automaticamente cambiato, come nel seguente esempio:
if (@nomi > 2) { print "L'array ha più di 2 elementi!"; }
Il frammento sopra riportato funziona correttamente poiché l'interprete si rende conto che il contesto dell'espressione if è scalare, e quindi modifica di conseguenza il significato di @nomi. Un'altra sintassi che permette di conoscere il numero di elementi ma che non risente di problemi di contesto è la seguente:
print $#nomi;
È tuttavia necessario prestare attenzione: questa sintassi in realtà restituisce l'indice dell'ultimo elemento e non il numero di elementi dell'array. Nel nostro caso scalar(@nomi) visualizza 4, mentre $#nomi visualizza 3, poiché gli array in Perl hanno indice iniziale 0: quindi scalar(@nomi) = $#nomi+1.
In Perl il ridimensionamento degli array avviene in maniera automatica: un array viene allungato o accorciato dinamicamente quando si inseriscono e tolgono degli elementi. Se ad esempio, prendendo sempre in considerazione l'array descritto sopra, diamo il comando:
$nomi[10] = 'Alessia';
viene automaticamente allocata memoria per tutti gli elementi fino all'undicesimo (quello cioè con indice 10). Allo stesso modo possiamo semplicemente accorciarne la dimensione con:
$#nomi = 2;
che imposta l'indice più alto a due, tagliando quindi fuori tutti gli elementi successivi.
|