Successivo: Precisazioni sulle funzioni, Precedente: Campo di validità variabili, Su: Chiamata di una funzione [Contenuti][Indice]
In awk
, quando si definisce una funzione, non c’è modo di
dichiarare esplicitamente se gli argomenti sono passati per valore
o per riferimento.
Invece, il modo con cui i parametri sono passati è determinato durante l’esecuzione del programma, quando la funzione è chiamata, nel rispetto della regola seguente: se l’argomento è una variabile di tipo vettoriale, questa è passata per riferimento. Altrimenti, l’argomento è passato per valore.
Passare un argomento per valore significa che quando una funzione è chiamata, le viene fornita una copia del valore di quell’argomento. Il chiamante può usare una variabile il cui valore calcolato viene passato come argomento, ma la funzione chiamata non la riconosce come variabile; riconosce solo il valore assunto dall’argomento. Per esempio, scrivendo il seguente codice:
pippo = "pluto" z = mia_funzione(pippo)
non si deve pensare che l’argomento passato a mia_funzione()
sia “la
variabile pippo
.” Invece, è corretto considerare l’argomento come la
stringa il cui valore è "pluto"
.
Se la funzione mia_funzione()
altera i valori delle sue variabili
locali, ciò non influisce su nessun’altra variabile. Quindi, se
mia_funzione()
fa questo:
function mia_funzione(stringa) { print stringa stringa = "zzz" print stringa }
cambiando così il valore della variabile che è il suo primo argomento, ossia
stringa
, il valore di pippo
per il chiamante non viene
modificato. Il ruolo svolto da pippo
nella chiamata di
mia_funzione()
termina quando il suo valore ("pluto"
) viene
calcolato. Se la variabile stringa
esiste anche al di fuori di
mia_funzione()
, il corpo della funzione non può modificare questo valore
esterno, perché esso rimane oscurato durante l’esecuzione di
mia_funzione()
e non può quindi essere visto o modificato.
Tuttavia, quando sono dei vettori a fungere da parametri alle funzioni, questi non vengono copiati. Invece, il vettore stesso è reso disponibile per essere manipolato direttamente dalla funzione. Questo è quel che si dice solitamente una chiamata per riferimento. Le modifiche effettuate su un vettore passato come parametro all’interno del corpo di una funzione sono visibili all’esterno della funzione.
NOTA: Modificare un vettore passato come parametro all’interno di una funzione può essere molto pericoloso se non si sta attenti a quel che si sta facendo. Per esempio:
function cambialo(vettore, ind, nvalore) { vettore[ind] = nvalore } BEGIN { a[1] = 1; a[2] = 2; a[3] = 3 cambialo(a, 2, "due") printf "a[1] = %s, a[2] = %s, a[3] = %s\n", a[1], a[2], a[3] }stampa ‘a[1] = 1, a[2] = due, a[3] = 3’, perché
cambialo()
memorizza"due"
nel secondo elemento dia
.
Successivo: Precisazioni sulle funzioni, Precedente: Campo di validità variabili, Su: Chiamata di una funzione [Contenuti][Indice]