Successivo: Vettori di vettori, Precedente: Cancellazione, Su: Vettori [Contenuti][Indice]
• Visitare vettori multidimensionali | Visitare vettori multidimensionali. |
Un vettore multidimensionale è un vettore in cui un elemento è
identificato da un insieme di indici invece che da un indice singolo. Per
esempio, un vettore bidimenisonale richiede due indici. Il modo consueto (in
molti linguaggi, compreso awk
) per far riferimento a un elemento di
un vettore multidimensionale chiamato griglia
è con
griglia[x,y]
.
I vettori multidimensionali sono resi disponibili in awk
attraverso
la concatenazione di più indici in una stringa;
awk
converte gli indici in stringhe
(vedi la sezione Conversione di stringhe e numeri) e
le concatena assieme, inserendo un separatore tra ognuna di loro. Ne
risulta una sola stringa che include i valori di ogni indice. La
stringa così composta viene usata come un singolo indice in un vettore
ordinario monodimensionale. Il separatore usato è il valore della variabile
predefinita SUBSEP
.
Per esempio, supponiamo di valutare l’espressione ‘pippo[5,12] = "valore"’
quando il valore di SUBSEP
è "@"
. I numeri 5 e 12 vengono
convertiti in stringhe che sono poi
concatenate con un ‘@’ tra di essi, dando "5@12"
; di conseguenza,
l’elemento del vettore pippo["5@12"]
è impostato a "valore"
.
Una volta che il valore dell’elemento è memorizzato, awk
ignora se sia stato memorizzato con un solo indice o con una
serie di indici. Le due espressioni ‘pippo[5,12]’ e
‘pippo[5 SUBSEP 12]’ sono sempre equivalenti.
Il valore di default di SUBSEP
è la stringa "\034"
,
che contiene un carattere non stampabile che difficilmente appare in
un programma di awk
e nella maggior parte dei dati di input.
Il vantaggio di scegliere un carattere improbabile discende dal fatto che i
valori degli indici che contengono una stringa corrispondente a SUBSEP
possono portare a stringhe risultanti ambigue. Supponendo che
SUBSEP
valga "@"
, ‘pippo["a@b", "c"]’ e
‘pippo["a", "b@c"]’ risultano indistinguibili perché entrambi
sarebbero in realtà memorizzati come ‘pippo["a@b@c"]’.
Per verificare se una determinata sequenza di indici esiste in un vettore
multidimensionale, si usa lo stesso operatore (in
) che viene usato
per i vettori monodimensionali. Si scrive l’intera sequenza di indici tra
parentesi, separati da virgole, come operando di sinistra:
if ((indice1, indice2, …) in vettore) …
Qui vediamo un esempio, avendo in input un vettore bidimensionale di campi, ruota questo vettore di 90 gradi in senso orario e stampa il risultato. Si suppone che tutte le righe in input contengano lo stesso numero di elementi:
{ if (max_nf < NF) max_nf = NF max_nr = NR for (x = 1; x <= NF; x++) vettore[x, NR] = $x } END { for (x = 1; x <= max_nf; x++) { for (y = max_nr; y >= 1; --y) printf("%s ", vettore[x, y]) printf("\n") } }
Dato l’input:
1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3
il programma produce il seguente output:
4 3 2 1 5 4 3 2 6 5 4 3 1 6 5 4 2 1 6 5 3 2 1 6
Successivo: Vettori di vettori, Precedente: Cancellazione, Su: Vettori [Contenuti][Indice]