Corso di Perl

Gli array II

 

Quello che push e pop fanno alla parte finale dell’array, shift e unshift lo fanno alla parte iniziale. Cioè:

shift @array;

accorcia l’array di un elemento (il primo), che viene ritornato, mentre

unshift @array, lista;

inserisce all’inizio 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 all’array. 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 dell’istruzione 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 un’ambiguità (non succede quasi mai). Perciò l’istruzione 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 all’array.
Oppure:

@dipendenti = (“Pippo”, @dipendenti);

che lo aggiunge in cima.

In realtà, le quattro istruzioni push, pop, shift e unshift sono casi particolari di un’istruzione più generale:

splice @ARRAY, INIZIO, NUMERO, LISTA


la quale prende @ARRAY, rimuove NUMERO elementi partendo dall’indice 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 dell’array”. Se INIZIO è negativo, si intende che gli indici sono numerati a partire dalla fine dell’array.

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 l’assegnazione, 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 un’attrazione 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 cos’altro 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 è l’ultimo indice dell’array, al quale va aggiunto 1 perché in genere c’è anche l’elemento zero. Per essere sicuri del risultato, questa è una versione migliore:

$numero =  scalar( @array);

che costringe l’array ad essere valutato in un contesto scalare. Il risultato (grazie ai meccanismi interni del Perl) è il numero di elementi dell’array. 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