Precedente: Usare BEGIN/END, Su: BEGIN/END [Contenuti][Indice]
BEGIN
ed END
Ci 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]