Successivo: Parametri per valore/riferimento, Precedente: Chiamare una funzione, Su: Chiamata di una funzione [Contenuti][Indice]
Diversamente da molti altri linguaggi, non c’è modo di
rendere locale una variabile in un blocco {
… }
di
awk
, ma si può rendere locale una variabile di una funzione. È
buona norma farlo quando una variabile serve solo all’interno di quella
particolare funzione.
Per rendere locale una variabile per una funzione, basta dichiarare la
variabile come argomento della funzione dopo gli argomenti richiesti dalla
funzione (vedi la sezione Come scrivere definizioni e cosa significano). Si consideri il seguente
esempio, dove la variabile i
è una variabile globale usata sia dalla
funzione pippo()
che dalla funzione pluto()
:
function pluto() { for (i = 0; i < 3; i++) print "in pluto i=" i } function pippo(j) { i = j + 1 print "in pippo i=" i pluto() print "in pippo i=" i } BEGIN { i = 10 print "in BEGIN i=" i pippo(0) print "in BEGIN i=" i }
L’esecuzione di questo script produce quanto segue, perché la stessa
variabile i
è usata sia nelle
funzioni pippo()
e pluto()
sia a livello della
regola BEGIN
:
in BEGIN i=10 in pippo i=1 in pluto i=0 in pluto i=1 in pluto i=2 in pippo i=3 in BEGIN i=3
Se si vuole che i
sia una variabile locale sia per
pippo()
che per pluto()
, occorre procedere in questo modo
(gli spazi extra prima della i
sono una convenzione di codifica
che serve a ricordare che i
è una variabile locale, non
un argomento):
function pluto( i) { for (i = 0; i < 3; i++) print "in pluto i=" i } function pippo(j, i) { i = j + 1 print "in pippo i=" i pluto() print "in pippo i=" i } BEGIN { i = 10 print "in BEGIN i=" i pippo(0) print "in BEGIN i=" i }
L’esecuzione della versione corretta dello script produce il seguente output:
in BEGIN i=10 in pippo i=1 in pluto i=0 in pluto i=1 in pluto i=2 in pippo i=1 in BEGIN i=10
Oltre a valori scalari (stringhe e numeri), si possono usare anche
vettori locali. Usando come parametro il nome di un vettore, awk
lo considera come tale, e lo tratta come locale alla funzione.
Inoltre, chiamate ricorsive creano nuovi vettori.
Si consideri questo esempio:
function qualche_funz(p1, a) { if (p1++ > 3) return
a[p1] = p1 qualche_funz(p1) printf("Al livello %d, indice %d %s trova in a\n", p1, (p1 - 1), (p1 - 1) in a ? "si" : "non si") printf("Al livello %d, indice %d %s trova in a\n", p1, p1, p1 in a ? "si" : "non si") print "" } BEGIN { qualche_funz(1) }
Quando viene eseguito, questo programma produce il seguente output:
Al livello 4, indice 3 non si trova in a Al livello 4, indice 4 si trova in a Al livello 3, indice 2 non si trova in a Al livello 3, indice 3 si trova in a Al livello 2, indice 1 non si trova in a Al livello 2, indice 2 si trova in a
Successivo: Parametri per valore/riferimento, Precedente: Chiamare una funzione, Su: Chiamata di una funzione [Contenuti][Indice]