Successivo: , Precedente: , Su: Chiamata di una funzione   [Contenuti][Indice]


9.2.3.2 Variabili locali e globali.

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: , Precedente: , Su: Chiamata di una funzione   [Contenuti][Indice]