Precedente: Campo di validità variabili, Su: Precisazioni sulle funzioni [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
.
Alcune implementazioni di awk
consentono di chiamare una
funzione che non è stata definita.
Viene solo emesso un messaggio che descrive il problema al momento
dell’esecuzione, se il programma tenta di chiamare quella funzione.
Per esempio:
BEGIN { if (0) pippo() else pluto() } function pluto() { … } # si noti che `pippo' non è definito
Poiché la condizione dell’istruzione ‘if’ non risulterà mai verificata
in questo caso,
non è un problema reale il fatto che
che pippo()
non sia stato definito. Solitamente, tuttavia,
è un problema se un programma chiama una funzione indefinita.
Se si specifica l’opzione --lint
(vedi Opzioni),
gawk
elenca le chiamate a funzioni indefinite.
Alcune implementazione di awk
emettono un messaggio di errore
se si usa l’istruzione next
o nextfile
(vedi Istruzione next, e
vedi Istruzione nextfile)
all’interno di una funzione definita dall’utente.
gawk
non ha questa limitazione.
Precedente: Campo di validità variabili, Su: Precisazioni sulle funzioni [Contenuti][Indice]