Precedente: Usare BEGIN/END, Su: BEGIN/END [Contenuti][Indice]
BEGIN ed ENDCi sono parecchi punti (talora insidiosi) da tener presente se si fa dell’I/O
all’interno di una regola BEGIN o END.
Il primo ha a che fare con il valore di $0 in una regola BEGIN.
Poiché le regole BEGIN sono eseguite prima delle lettura di qualsiasi
input, non c’è assolutamente alcun record in input, e quindi nessun campo,
quando si eseguono delle regole BEGIN. I riferimento a $0 e ai
campi restituiscono una stringa nulla o zero, a seconda del contesto.
Un modo per assegnare un valore effettivo a $0 è di eseguire un
comando getline senza indicare una variabile (vedi la sezione Richiedere input usando getline).
Un altro modo è semplicemente quello di assegnare un valore a $0.
Il secondo punto è simile al primo, ma in direzione opposta.
Tradizionalmente, più che altro per problemi di implementazione, $0
e NF erano indefiniti all’interno di una regola END.
Lo standard POSIX prescrive che NF sia disponibile all’interno di una
regola END. Contiene il numero di campi dell’ultimo record in input.
Probabilmente per una svista, lo standard non specifica che è reso
disponibile anche $0, sebbene possa apparire logico che sia così.
In effetti, BWK awk, mawk e gawk mantengono il
valore di $0 in modo che sia possibile usarlo all’interno delle regole
END. Occorre peraltro tener presente che alcune altre implementazioni
e parecchie tra le versioni più vecchie di Unix awk non si
comportano così.
Il terzo punto è una conseguenza dei primi due. Il significato di
‘print’
all’interno di una regola BEGIN o END è quello di sempre:
‘print $0’. Se $0 è la stringa nulla, stampa una riga vuota.
Molti programmatori di lungo corso di awk usano un semplice
‘print’ all’interno delle regole BEGIN ed END,
intendendo ‘print ""’, contando sul fatto che $0 sia una
stringa nulla. Sebbene questo funzioni solitamente con le regole
BEGIN, è una pessima idea nelle regole END,
almeno in gawk. È anche stilisticamente inelegante, perché se
serve una riga vuota in output, il programma dovrebbe stamparne
una esplicitamente.
Per finire, le istruzioni next e nextfile non sono consentite
all’interno di una regola BEGIN, perché il ciclo implicito
leggi-un-record-e-confrontalo-con-le-regole non è ancora iniziato.
Analogamente, tali istruzioni non sono valide all’interno di una regola
END, perché tutto l’input è già stato letto.
(Vedi la sezione L’istruzione next e
vedi la sezione L’istruzione nextfile.)
Precedente: Usare BEGIN/END, Su: BEGIN/END [Contenuti][Indice]