Successivo: Controllo di file, Precedente: Funzione filetrans, Su: Gestione File Dati [Contenuti][Indice]
Un’altra richiesta per una nuova funzione predefinita è stata per
una funzione per rileggere il file corrente.
L’utente che l’ha richiesta non voleva dover usare getline
(vedi la sezione Richiedere input usando getline)
all’interno di un ciclo.
Comunque, se non si è nella regola END, è piuttosto facile
fare in modo di chiudere il corrente file in input immediatamente
e ricominciare a leggerlo dall’inizio.
In mancanza di un nome migliore, chiameremo la funzione rewind():
# rewind.awk --- ricarica il file corrente e ricomincia a leggerlo
function rewind( i)
{
# sposta in alto i rimanenti argomenti
for (i = ARGC; i > ARGIND; i--)
ARGV[i] = ARGV[i-1]
# assicurarsi che gawk sappia raggiungerli
ARGC++
# fa sì che il file corrente sia il prossimo a essere letto
ARGV[ARGIND+1] = FILENAME
# do it
nextfile
}
La funzione rewind() dipende dalla variabile ARGIND
(vedi la sezione Variabili predefinite con cui awk fornisce informazioni), che è specifica di gawk. Dipende anche
dalla parola chiave nextfile (vedi la sezione L’istruzione nextfile).
Perciò, non si dovrebbe chiamarla da una regola ENDFILE.
(Non sarebbe peraltro necessario, perché gawk legge il file
successivo non appena la regola ENDFILE finisce!)
Occorre prestare attenzione quando si chiama rewind(). Si può
provocare una ricorsione infinita se non si sta attenti. Ecco un
esempio di uso:
$ cat dati
-| a
-| b
-| c
-| d
-| e
$ cat test.awk
-| FNR == 3 && ! riavvolto {
-| riavvolto = 1
-| rewind()
-| }
-|
-| { print FILENAME, FNR, $0 }
$ gawk -f rewind.awk -f test.awk dati
-| data 1 a
-| data 2 b
-| data 1 a
-| data 2 b
-| data 3 c
-| data 4 d -| data 5 e
Successivo: Controllo di file, Precedente: Funzione filetrans, Su: Gestione File Dati [Contenuti][Indice]