Successivo: , Su: Fondamenti sui vettori   [Contenuti][Indice]


8.1.1 Introduzione ai vettori

Visitare sequenzialmente un vettore associativo è come tentare di lapidare qualcuno usando una mitragliatrice Uzi carica.

Larry Wall

Il linguaggio awk mette a disposizione vettori monodimensionali per memorizzare gruppi di stringhe o di numeri correlati fra loro. Ogni vettore di awk deve avere un nome. I nomi dei vettori hanno la stessa sintassi dei nomi di variabile; qualsiasi nome valido di variabile potrebbe essere anche un valido nome di vettore. Un nome però non può essere usato in entrambi i modi (come vettore e come variabile) nello stesso programma awk.

I vettori in awk assomigliano superficialmente ai vettori in altri linguaggi di programmazione, ma ci sono differenze fondamentali. In awk, non è necessario specificare la dimensione di un vettore prima di iniziare a usarlo. In più, qualsiasi numero o stringa può essere usato come indice di un vettore, non solo numeri interi consecutivi.

Nella maggior parte degli altri linguaggi, i vettori devono essere dichiarati prima dell’uso, specificando quanti elementi o componenti contengono. In questi linguaggi, la dichiarazione causa l’allocazione, per questi elementi, di un blocco di memoria contiguo. Normalmente, un indice di un vettore dev’essere un intero non negativo. Per esempio, l’indice zero specifica il primo elemento nel vettore, che è effettivamente memorizzato all’inizio di un blocco di memoria. L’indice uno specifica il secondo elemento, che è memorizzato subito dopo il primo elemento, e così via. È impossibile aggiungere ulteriori elementi al vettore, perché esso può contenere solo il numero di elementi dichiarato. (Alcuni linguaggi consentono indici iniziali e finali arbitrari — p.es., ‘15 .. 27’ — però la dimensione del vettore rimane fissa una volta che il vettore sia stato dichiarato.)

Un vettore contiguo di quattro elementi potrebbe essere come quello in Figura 8.1, concettualmente, se i valori degli elementi sono 8, "pippo", "" e 30.

Un vettore contiguo

Figura 8.1: Un vettore contiguo

Vengono memorizzati solo i valori; gli indici sono definiti implicitamente dall’ordine dei valori. Qui, 8 è il valore il cui indice è zero, perché 8 appare nella posizione con zero elementi prima di essa.

I vettori in awk non sono di questo tipo: sono invece associativi. Ciò significa che ogni vettore è un insieme di coppie, ognuna costituita da un indice e dal corrispondente valore dell’elemento del vettore:

IndiceValore
330
1"pippo"
08
2""

Le coppie sono elencate in ordine casuale perché il loro ordinamento è irrilevante.41

Un vantaggio dei vettori associativi è che si possono aggiungere nuove coppie in qualsiasi momento. Per esempio, supponiamo di aggiungere al vettore un decimo elemento il cui valore sia "numero dieci". Il risultato sarà:

IndiceValore
10"numero dieci"
330
1"pippo"
08
2""

Ora il vettore è sparso, il che significa semplicemente che non sono usati alcuni indici. Ha gli elementi 0, 1, 2, 3 e 10, ma mancano gli elementi 4, 5, 6, 7, 8 e 9.

Un’altra caratteristica dei vettori associativi è che gli indici non devono essere necessariamente interi non negativi. Qualsiasi numero, o anche una stringa, può essere un indice. Per esempio, il seguente è un vettore che traduce delle parole dall’inglese all’italiano:

IndiceValore
"dog""cane"
"cat""gatto"
"one""uno"
1"uno"

Qui abbiamo deciso di tradurre il numero uno sia nella forma letterale che in quella numerica, per illustrare che un singolo vettore può avere come indici sia numeri che stringhe. (In effetti, gli indici dei vettori sono sempre stringhe. Ci sono alcune sottigliezze su come funzionano i numeri quando sono usati come indici dei vettori; questo verrà trattato in maggior dettaglio nella Usare numeri per indicizzare i vettori.) Qui sopra, il numero 1 non è tra doppi apici, perché awk lo converte automaticamente in una stringa.

Il valore di IGNORECASE non ha alcun effetto sull’indicizzazione dei vettori. Lo stesso valore di stringa usato per memorizzare un elemento di un vettore può essere usato per richiamarlo. Quando awk crea un vettore (p.es., con la funzione predefinita split()), gli indici di quel vettore sono numeri interi consecutivi a partire da uno. (Vedi la sezione Funzioni di manipolazione di stringhe.)

I vettori di awk sono efficienti: il tempo necessario per accedere a un elemento è indipendente dal numero di elementi nel vettore.


Note a piè di pagina

(41)

L’ordine potrà variare nelle diverse implementazioni di awk, che tipicamente usa tabelle hash per memorizzare elementi e valori del vettore.


Successivo: , Su: Fondamenti sui vettori   [Contenuti][Indice]