Quello che push e pop fanno alla parte finale dellarray,
shift e unshift lo fanno alla parte iniziale. Cioè:
shift @array;
accorcia larray di un elemento (il primo), che viene ritornato,
mentre
unshift @array, lista;
inserisce allinizio di @array una lista.
Come vi ho detto più volte, il Perl vi dà una grande libertà di
espressione. Queste istruzioni fanno tutte la stessa cosa:
push @dipendenti, Pippo;
push @dipendenti, (Pippo);
Il risultato di ognuna di queste istruzioni, come vedete sicuramente
da soli, è di aggiungere la stringa Pippo in fondo allarray.
Potete scegliere quella che più vi piace o che più si adatta al
vostro stile.
Funziona anche così:
push (@dipendenti, Pippo);
Le parentesi non indicano una lista, ma servono a racchiudere gli
argomenti dellistruzione push. Il fatto è che in molti linguaggi
di programmazione, qualunque argomento va messo tra parentesi. Nel
Perl queste parentesi sono opzionali, a meno che non servano a risolvere
unambiguità (non succede quasi mai). Perciò listruzione
push (e tutte le altre) funziona altrettanto bene sia che abbia
i suoi argomenti messi tra parentesi, sia che le parentesi non ci
siano.
Un modo creativo per usare le parentesi è questo:
push @dipendenti, qw(Pippo
Gino Beppe Mario);
qw è un operatore chiamato quote word, e
indica al Perl che ciò che sta dentro le parentesi è una lista di
parole, separate da spazi bianchi. E come se avessimo scritto:
push @dipendenti, (Pippo,
Gino, Beppe, Mario);
solo che è più semplice.
Potete evitare push del tutto scrivendo questo:
@dipendenti = (@dipendenti, Pippo);
che, di nuovo, aggiunge Pippo in fondo allarray.
Oppure:
@dipendenti = (Pippo,
@dipendenti);
che lo aggiunge in cima.
In realtà, le quattro istruzioni push, pop, shift e unshift sono
casi particolari di unistruzione più generale:
splice @ARRAY, INIZIO, NUMERO, LISTA
la quale prende @ARRAY, rimuove NUMERO elementi partendo dallindice
INIZIO, e li sostituisce con LISTA. La lista può essere omessa (in
tal caso gli elementi vengono rimossi, ma non viene aggiunto niente).
Anche NUMERO può essere omesso, per sottindendere fino alla
fine dellarray. Se INIZIO è negativo, si intende che
gli indici sono numerati a partire dalla fine dellarray.
Se vi sembra complicato sappiate che è normale. Potete meditare
su queste equivalenze, che ho preso pari pari dalla guida inclusa
col Perl:
push(@a,$x,$y) splice(@a,@a,0,$x,$y)
pop(@a) splice(@a,-1)
shift(@a) splice(@a,0,1)
unshift(@a,$x,$y) splice(@a,0,0,$x,$y)
$a[$x] = $y splice(@a,$x,1,$y)
Come vedete ogni push, pop e compagnia, e perfino lassegnazione,
può essere espressa mediante una splice.
Vi assicuro che raramente vi troverete ad usare splice. Però è utile
conoscerla, quando dovete interpretare codice scritto da altri,
i quali potrebbero provare unattrazione perversa verso questa
istruzione.
Quanto è grande?
Per sapere quanti elementi ha un array, potete fare così:
$numero = $#array +1;
Se vi state chiedendo il perché del $#, la spiegazione
è questa: poiché il numero di elementi è uno scalare, la sintassi
del Perl obbliga ad usare un $. Non sapendo cosaltro
aggiungere, Larry Wall ha guardato la tastiera per vedere cosa era
rimasto di utilizzabile, e ha trovato #. Battute a parte,
il +1 serve perché $#array è lultimo indice dellarray,
al quale va aggiunto 1 perché in genere cè anche lelemento
zero. Per essere sicuri del risultato, questa è una versione migliore:
$numero = scalar( @array);
che costringe larray ad essere valutato in un contesto scalare.
Il risultato (grazie ai meccanismi interni del Perl) è il numero
di elementi dellarray. Il contesto è un concetto da
ricordare. Nelle prossime lezioni, incontreremo istruzioni che fanno
cose differenti se si trovano in un contesto scalare o array, cioè
se il loro risultato deve finire in una variabile scalare o in un
array.
Per oggi basta. Nella prossima puntata passeremo agli array associativi,
che sono simili ma più potenti di quelli normali.
Torna all'indice Generale del corso di Corso di Perl di Software Planet