Successivo: , Precedente: , Su: Vettori   [Contenuti][Indice]


8.5 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: , Precedente: , Su: Vettori   [Contenuti][Indice]