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


8.3 Usare variabili non inizializzate come indici

Supponiamo che sia necessario scrivere un programma per stampare i dati di input in ordine inverso. Un tentativo ragionevole per far ciò (con qualche dato di prova) potrebbe essere qualcosa di questo tipo:

$ echo 'riga 1
> riga 2
> riga 3' | awk '{ l[righe] = $0; ++righe }
> END {
>     for (i = righe - 1; i >= 0; i--)
>        print l[i]
> }'
-| riga 3
-| riga 2

Sfortunatamente, la prima riga di dati in input non appare nell’output!

A prima vista, verrebbe da dire che questo programma avrebbe dovuto funzionare. La variabile righe non è inizializzata, e le variabili non inizializzate hanno il valore numerico zero. Così, awk dovrebbe aver stampato il valore l[0].

Qui il problema è che gli indici per i vettori di awk sono sempre stringhe. Le variabili non inizializzate, quando sono usate come stringhe, hanno il valore "", e non zero. Quindi, ‘riga 1’ finisce per essere memorizzata in l[""]. La seguente variante del programma funziona correttamente:

{ l[righe++] = $0 }
END {
    for (i = righe - 1; i >= 0; i--)
       print l[i]
}

Qui, ‘++’ forza righe a essere di tipo numerico, rendendo quindi il “vecchio valore” uno zero numerico. Questo viene poi convertito in "0" come l’indice del vettore.

Anche se la cosa può sembrare strana, la stringa nulla ("") è un indice di vettore valido. (a.b.) Se viene fornita l’opzione --lint sulla riga di comando vedi la sezione Opzioni sulla riga di comando), gawk avvisa quando la stringa nulla viene usata come indice.


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