Successivo: , Precedente: , Su: Per iniziare   [Contenuti][Indice]


1.6 Istruzioni e righe in awk

Molto spesso, ogni riga di un programma awk è un’istruzione a sé stante o una regola isolata, come:

awk '/12/  { print $0 }
     /21/  { print $0 }' mail-list inventory-shipped

Comunque, gawk ignora i ritorni a capo dopo ognuno di questi simboli e istruzioni:

,    {    ?    :    ||    &&    do    else

Un ritorno a capo in ogni altro punto del programma è considerato come la fine di un’istruzione.9

Volendo dividere una sola istruzione su due righe in un punto in cui andando a capo sarebbe considerata conclusa, è possibile continuare nella riga successiva terminando la prima riga con un carattere di barra inversa (‘\’). La barra inversa dev’essere l’ultimo carattere sulla riga, per essere riconosciuto come un carattere di continuazione. Una barra inversa seguita da un ritorno a capo è consentita in ogni parte dell’istruzione, anche in mezzo a una stringa o a un’espressione regolare. Per esempio:

awk '/Questa espressione regolare è troppo lunga, quindi\
 la continuiamo sulla riga seguente/ { print $1 }'

Non abbiamo quasi mai usato la continuazione tramite barra inversa nei nostri programmi di esempio. gawk non pone limiti alla lunghezza di una riga, quindi la continuazione tramite barra inversa non è mai strettamente necessaria; serve soltanto a migliorare la leggibilità del programma. Per la stessa ragione, ma anche per amore di chiarezza, abbiamo tenuto concise molte istruzioni nei programmi presentati in questo Documento.

La continuazione tramite barra inversa è molto utile quando il proprio programma awk si trova in un file sorgente separato, invece di essere immesso nella riga di comando. Si noti anche che molte implementazioni di awk presentano delle differenze su dove è possibile usare la continuazione tramite barra inversa. Per esempio, potrebbero non consentire di spezzare una costante di tipo stringa usando la continuazione tramite barra inversa. Quindi, per ottenere la massima portabilità dei propri programmi awk, è meglio non spezzare le righe nel mezzo di un’espressione regolare o di una stringa.

ATTENZIONE: la continuazione tramite barra inversa non funziona come sopra descritto nella C shell. Funziona per programmi awk contenuti in file e per programmi sulla riga di comando, ammesso che si stia usando una shell conforme a POSIX, come la Unix Bourne shell o Bash. Ma la C shell si comporta in maniera diversa! In quel caso, occorre usare due barre inverse consecutive, in fondo alla riga. Si noti anche che quando si usa la C shell ogni andata a capo nel vostro programma awk deve essere indicata con una barra inversa. Per esempio:

% awk 'BEGIN { \
?   print \\
?       "ciao, mondo" \
? }'
-| ciao, mondo

Qui, il ‘%’ e il ‘?’ sono i prompt primario e secondario della C shell, analogamente a quelli usati nella shell standard ‘$’ e ‘>’.

Si confronti l’esempio precedente, come viene scritto in una shell conforme a POSIX:

$ awk 'BEGIN {
>   print \
>       "ciao, mondo"
> }'
-| ciao, mondo

awk è un linguaggio orientato alla riga. L’azione relativa a ogni regola deve iniziare sulla stessa riga del criterio di selezione. Per avere criterio di selezione e azione su righe separate, si deve usare la continuazione tramite barra inversa; non si può fare diversamente.

Un’altra cosa da tener presente è che la continuazione tramite barra inversa e i commenti non possono essere frammisti. Non appena awk incontra un ‘#’ che inizia un commento, ignora tutto il resto della riga. Per esempio:

$ gawk 'BEGIN { print "Non allarmarti" # una amichevole \
>                regola BEGIN
> }'
error→ gawk: riga com.:2:              regola BEGIN
error→ gawk: riga com.:2:                     ^ syntax error

In questo caso, parrebbe che la barra inversa continui il commento sulla riga successiva. Invece, la combinazione barra inversa-ritorno a capo non viene per nulla notata, in quanto “nascosta” all’interno del commento. Quindi, il BEGIN è marcato come errore di sintassi.

Quando le istruzioni awk all’interno di una regola sono brevi, si potrebbe metterne più d’una su una riga sola. Ciò è possibile separando le istruzioni con un punto e virgola (‘;’). Questo vale anche per le regole stesse. Quindi, il programma visto all’inizio di questa sezione poteva essere scritto anche così:

/12/ { print $0 } ; /21/ { print $0 }

NOTA BENE: La possibilità che più regole coesistano sulla stessa riga, se sono separate da un punto e virgola, non esisteva nel linguaggio awk originale; è stata aggiunta per congruenza con quanto è consentito per le istruzioni all’interno di un’azione.


Note a piè di pagina

(9)

Il ‘?’ e i ‘:’ elencati sopra sono usati nell’espressione condizionale in tre parti descritta in Espressioni condizionali. Il cambio di riga dopo ‘?’ e i ‘:’ è un’estensione minore in gawk; specificando --posix come opzione (vedi la sezione Opzioni sulla riga di comando), quest’estensione non è valida.


Successivo: , Precedente: , Su: Per iniziare   [Contenuti][Indice]