Successivo: Visitare elementi, Su: Fondamenti sui vettori [Contenuti][Indice]
Visitare sequenzialmente un vettore associativo è come tentare di lapidare qualcuno usando una mitragliatrice Uzi carica.
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.
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:
Indice | Valore | |
---|---|---|
3 | 30 | |
1 | "pippo" | |
0 | 8 | |
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à:
Indice | Valore | |
---|---|---|
10 | "numero dieci" | |
3 | 30 | |
1 | "pippo" | |
0 | 8 | |
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:
Indice | Valore | |
---|---|---|
"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.
L’ordine potrà variare nelle diverse implementazioni
di awk
, che tipicamente usa tabelle hash per memorizzare
elementi e valori del vettore.
Successivo: Visitare elementi, Su: Fondamenti sui vettori [Contenuti][Indice]