Precedente: , Su: BEGIN/END   [Contenuti][Indice]


7.1.4.2 Input/Output dalle regole 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: , Su: BEGIN/END   [Contenuti][Indice]