Successivo: , Precedente: , Su: Istruzioni   [Contenuti][Indice]


7.4.4 L’istruzione for

L’istruzione for rende più agevole contare le iterazioni di un ciclo. La forma generale dell’istruzione for è simile a questa:

for (inizializzazione; condizione; incremento)
  corpo-del-ciclo

La parti inizializzazione, condizione e incremento sono espressioni awk a piacere, e corpo-del-ciclo indica qualsiasi istruzione awk.

L’istruzione for comincia con l’esecuzione di inizializzazione. Poi, finché la condizione è vera, esegue ripetutamente corpo-del-ciclo, e quindi incremento. Tipicamente, inizializzazione imposta una variabile a zero o a uno, incremento aggiunge uno alla stessa e condizione ne confronta il valore rispetto al numero desiderato di iterazioni. Per esempio:

awk '
{
    for (i = 1; i <= 3; i++)
        print $i
}' inventory-shipped

Questo programma stampa i primi tre campi di ogni record in input, mettendo un unico campo in una riga in output.

Non è possibile impostare più di una variabile nella parte di inizializzazione senza usare un’istruzione di assegnamento multiplo, come ‘x = y = 0’. Ciò ha senso solo se tutti i valori iniziali sono uguali. (Ma è possibile inizializzare ulteriori variabili scrivendo i relativi assegnamenti come istruzioni separate prima del ciclo for.)

Lo stesso vale per la parte incremento. Se serve incrementare ulteriori variabili, questo va fatto con istruzioni separate alla fine del ciclo. L’espressione composta del linguaggio C, che usa l’operatore virgola [,] del C, sarebbe utile in questo contesto, ma non è prevista in awk.

Molto spesso, incremento è un’espressione di incremento, come nell’esempio precedente. Ma questo non è obbligatorio; può trattarsi di un’espressione qualsiasi. Per esempio, la seguente istruzione stampa tutte le potenze di due comprese tra 1 e 100:

for (i = 1; i <= 100; i *= 2)
    print i

Se non è necessaria, ognuna delle tre espressioni fra parentesi che segue la parola chiave for può essere omessa. Quindi, ‘for (; x > 0;) equivale a ‘while (x > 0). Se la condizione è omessa del tutto, è ritenuta sempre vera, producendo un ciclo infinito (cioè, un ciclo che non finisce mai).

Molto spesso, un ciclo for è un’abbreviazione per un ciclo while, come si può vedere qui:

inizializzazione
while (condizione) {
  corpo-del-ciclo
  incremento
}

La sola eccezione è quando l’istruzione continue (vedi la sezione L’istruzione continue) è usata all’interno del ciclo. Se si modifica un’istruzione for sostituendola con un’istruzione while ciò può cambiare l’effetto dell’istruzione continue posta all’interno del ciclo.

Il linguaggio awk ha un’istruzione for oltre all’istruzione while perché un ciclo for è spesso più semplice da scrivere, e viene in mente più naturalmente. Contare il numero di iterazioni è molto frequente nei cicli. Può essere più facile pensare a questo conto come parte del ciclo, piuttosto che come qualcosa da fare all’interno del ciclo.

Esiste una versione alternativa al ciclo for, per esaminare tutti gli indici di un vettore:

for (i in vettore)
    fai qualcosa con vettore[i]

Vedi la sezione Visitare tutti gli elementi di un vettore per maggiori informazioni su questa versione del ciclo for.


Successivo: , Precedente: , Su: Istruzioni   [Contenuti][Indice]