Successivo: Cancellazione, Precedente: Indici numerici di vettore, Su: Vettori [Contenuti][Indice]
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: Cancellazione, Precedente: Indici numerici di vettore, Su: Vettori [Contenuti][Indice]