# Perl/Variabili vettori

Perl
Copertina Bibliografia Tutti i moduli · Sviluppo
    CopertinaPerl/Copertina
* IntroduzionePerl/Introduzione
* C'è Perl?Perl/C'è Perl?
* Primo programma: Ciao Mondo!Perl/Primo programma: Ciao Mondo!
** Primo programma in un filePerl/Primo programma in un file
* VariabiliPerl/Variabili
** Variabili scalariPerl/Variabili scalari
** Variabili vettoriPerl/Variabili vettori
** Variabili hashPerl/Variabili hash
* IstruzioniPerl/Istruzioni
** Istruzioni minimePerl/Istruzioni minime
** Istruzioni compostePerl/Istruzioni composte
** Istruzioni racchiuse o bloccoPerl/Istruzioni racchiuse o blocco
** Istruzioni etichettaPerl/Istruzioni etichetta
** Istruzioni particolari su blocchi o etichettePerl/Istruzioni particolari su blocchi o etichette
** Istruzioni decisionaliPerl/Istruzioni decisionali
** CicliPerl/Cicli
* Applicare la teoriaPerl/Applicare la teoria
* FunzioniPerl/Funzioni
* Funzioni Native sulle variabiliPerl/Funzioni Native sulle variabili
** Funzioni Native su scalariPerl/Funzioni Native su scalari
** Funzioni Native su vettoriPerl/Funzioni Native su vettori
** Funzioni Native su hashPerl/Funzioni Native su hash
* FilePerl/File
* Espressioni regolariPerl/Espressioni regolari
** Espressioni regolari (oltre)Perl/Espressioni regolari (oltre)
** Espressioni regolari (contesto)Perl/Espressioni regolari (contesto)
Modifica il sommario
I vettori o array si possono immaginare come un treno. Ogni treno ha un certo numero di vagoni.
Analogamente gli array sono in insieme di scalari.
Come nel treno le carrozze sono numerate, così negli array per identificare una informazione si usa un numero intero.
La numerazione parte da 0 ed arriva fino al numero di elementi - 1.
Quindi un vettore con 5 elementi :
* la prima "carrozza" sarà identificata con il numero 0 (e non 1)
* l'ultima "carrozza" sarà identificata con il numero 4
infatti 0,1,2,3,4 sono 5 elementi.
Vediamo un altro esempio di 100 elementi:
treno - vagoni : 1 2 3 4 5 ... 100
array - scalari : 0 1 2 3 4 ... 99

### Il nome

Come per le variabili scalari , per identificare una variabile vettore (più valori in fila) occorre anteporre al nome il carattere @ (sigillo). Il nome di una variabile DEVE iniziare con "lettere", "_" , "'", mentre dal secondo carattere oltre ai precedenti si possono usare i "numeri" fino ad un massimo di 256 caratteri. NOTA: Essendo un linguaggio "case sensitive" le lettere maiuscole e le lettere minuscole sono differenti.
NOTA: il nome di un vettore non può iniziare con numeri !!!

### Il contenuto

Il contenuto è un qualsiasi scalare.
Vediamo la sintassi per creare un array:
Per poter usare i valori dell'array occorre poter selezionare il dato singolo. Per far questo si utilizza il metodo dell'indice. L'indice rappresenta la posizione del dato. Nel nostro caso la sintassi prevede l'uso delle parentesi quadre come identificatore dell'indice. Vediamo ora se volessi scrivere il terzo valore dell'array (è alla posizione 2 perché si conta da 0):
questo scriverà : 3 per il primo array, 1 per il secondo array, mercoledì per il terzo array.
Notare che la gestione dei simboli è corretta: se intendo gestire l'array nella sua "totalità" uso il simbolo @ mentre se ne voglio un elemento, quindi una variabile scalare, allora uso "$" con il nome del vettore e l'identificatore della posizione racchiuso fra parentesi quadre.
Il Perl ha adottato la particolarità del contesto per sapere di quanti elementi è composto un array:
Tuttavia esiste una sintassi specifica per sapere il valore dell'ultimo indice o per "forzare" la quantità di elementi di un array:
Mentre se si usa l'istruzione:
Ora @a ha ben 10 elementi, di scalari di valore undef.
NOTA se l'array ha un numero inferiore di elementi rispetto a quelli presenti , gli elementi che sono stati "aggiunti" hanno valore undef.

### Linerizzazione

Con questa parola intendo la "trasformazione" che il linguaggio opera automaticamente nel trattare nel contesto gli array. Vediamo questo esempio:
Nell'esempio trattato, @b ha i valori ( 1 , 2 , 3 , 4 , 5 , 6 ), quindi al posto di @a sono stati inseriti i suoi valori. Quindi in @a non è stato messo il numero di elementi di @a ma gli elementi stessi che costituiscono il vettore. Questo che può apparire strano in realtà è molto utile per "sommare" elementi e giuntarli. Se si volesse inserire un array è necessario mettere un reference (e quindi lo scalare che punta alle informazioni di "tipo" array). Se si volesse mettere il numero di elementi di un array è obbligatorio usare $#a.

### Notazione [ x , y , z ] e [ x .. y ]

In Perl esiste la possibilità di estrarre o trattare contemporaneamente più informazioni da un array. Questo è possibile perché è possibile identificare sinteticamente più informazioni.
* nel caso della notazione [ x , y , z ] si indicano gli elementi alla posizione x, y, z (nell'esempio sono 3, ma possono essere di più o di meno!).
* nel caso della notazione [ x .. y ] si indicano tutti gli elementi che vanno dall'elemento x a quello y.
Se gli elementi x e y sono numeri, la notazione indica tutti i numeri (distanziati da un'unità) che intercorrono fra x e y. Invece, nel caso di lettere (stringhe) sono tutti i caratteri fra la prima lettera (stringa) e l'altra: 'a' .. 'f' equivale ad a, b, c, d, e, f.
in @alfabeto ci saranno tutte le lettere dalla A alla Z
in giorni del mese ci saranno tutti i numeri da 01 a 31 (compreso 05, 11 , 21 etc)
in @ACD contiene ( 'A' , 'C' , 'D' ) prelevate da alfabeto dalle posizioni 0,2,3
in @s contiene ( undef , undef , 'PIPPO' , 'pluto' , undef , 'CIAO' )
in @k contiene ( 'mario' , 'giuseppe' ) NOTA: in quest'ultimo assegnamento lo si poteva ottenere anche con il seguente codice:

### Funzioni per immettere informazioni nei vettori

Oltre ai metodi precedentemente esposti è possibile utilizzare delle funzioni che trattano i vettori come file dalle quali estrarre informazioni dall'inizio o dalla coda Le funzioni sono push, pop, shift e unshift.
* push e pop lavorano sulla "coda del treno".
* shift e unshift lavorano sulla "testa del treno".
* push mette le informazioni in fondo
* pop estrae le informazioni dal fondo
* shift estrae le informazioni dalla testa
* unshift mette le informazioni dalla testa

### Da array a stringa e viceversa

Oltre al modo "puntatore" $nome[posizione] è possibile passare da una stringa ad un vettore utilizzando due funzioni che trattano il vettore/stringa nel suo complesso:
* join consente di aggregare i dati di un vettore in stringa
* split consente di "separare" una stringa ed ottenere un vettore
In particolare join "unisce" i valori dell'array mettendo fra loro la stringa indicata dall'utente:
NOTA: se l'array passato non ha elementi torna una stringa vuota.
Mentre per split il discorso è più articolato in quanto come elemento separatore accetta una espressione regolare che al momento è prematuro introdurre. Semplificando si può dire che accetta una stringa che risulta essere il separatore. Limitando l'esempio a strighe statiche :
quindi in @a avremo ( "questo" , "testo" , "verrà" , "diviso" , "in" , "ogni" , "parola" ) per fare l'operazione contraria basterà scrivere:

### Uso di qw/.../

Come per gli scalari si è visto l'uso di q/.../ e qq/.../ così è stato introdotto per i vettori qw/.../. In pratica consente di assegnare ad un vettore le singole stringhe separate da spazio presenti al posto dei puntini. Esempio:

### delete

Questa funzione consente di cancellare un dato da un array.Tuttavia, se non è all'ultima posizione, non riduce la dimensione dell'array.
che mostrerà:
NOTA: da notare lo "__" fra la parola "verrà" e la parola "in" : in quel punto c'è un elemento undef e quindi vengono aggiunti 2 "_" (uno per il valore "undef" e uno per il valore "in")

### Dopo tanta teoria un po' di pratica

Vediamo ora una soluzione ottenibile con le informazioni finora trattate.
ESEMPIO1 Assegnare ad un vettore i numeri da 1 a 12.
ESEMPIO2 Assegnare ad un altro vettore i nomi dei mesi usando la funzione split.
ESEMPIO3 Scrivere il dato corrispondente alla terza posizione del vettore precedente.
nota: il terzo mese ha le informazioni alla posizione 2 nel vettore (si parte da 0 a contare: 0 1 2 ).
ESEMPIO4 Dati due array: uno con numerazione da 1 a 12, l'altro con il nome dei mesi, scrivere i dati relativi al mese numero 3 nella seguente forma: "il mese " + numero del mese + "ha il nome: " + il relativo nome.
nota: si è usato "$meseDaScrivere -1" perché il vettore iniziando a contare da 0, il mese 3 ha le informazioni alla posizione 2 nel vettore.

# Riassunto

I vettori:
* sono identificati dal sigillo "@" davanti al nome
* contengono uno o più valori scalari
* si ottengono/assegnano i dati (scalari) utilizzando la sintassi $'nome'['posizione']
* si utilizzano le funzioni pop, push, shift, unshift per mettere togliere elementi
* si utilizzano le funzioni join, split per "passare" da stringa a vettore e viceversa