Successivo: Esempio di funzione, Su: Funzioni definite dall'utente [Contenuti][Indice]
Risponde al vero affermare che la sintassi di awk per la definizione di variabili locali è semplicemente atroce.
Definizioni di funzioni possono stare in una posizione qualsiasi tra le regole
di un programma awk
. Quindi, la forma generale di un
programma awk
è estesa per
permettere l’inclusione di regole e la definizione di funzioni
create dall’utente.
Non è necessario che la definizione di una funzione sia posta prima
del richiamo della stessa. Questo dipende dal fatto che awk
legge l’intero programma, prima di iniziare ad eseguirlo.
La definizione di una funzione chiamata nome è simile a questa:
function
nome(
[lista-parametri])
{
corpo-della-funzione}
Qui, nome è il nome della funzione da definire. Un nome di funzione
valido è come un nome di variabile valido: una sequenza di
lettere, cifre e trattini bassi che non inizia con una cifra.
Anche qui, solo le 52 lettere inglesi maiuscole e minuscole possono
essere usate in un nome di funzione.
All’interno di un singolo programma awk
, un dato nome può essere
usato una sola volta: per una variabile, o per un vettore,
o per una funzione.
lista-parametri è una lista opzionale degli argomenti della funzione e dei nomi delle variabili locali, separati da virgole. Quando la funzione viene chiamata, i nomi degli argomenti sono usati per contenere il valore degli argomenti passati con la chiamata.
Una funzione non può avere due parametri con lo stesso nome, e neanche un parametro con lo stesso nome della funzione stessa.
ATTENZIONE: Secondo lo standard POSIX, i parametri di funzione non possono avere lo stesso nome di una delle speciali variabili predefinite (vedi la sezione Variabili predefinite), e un parametro di funzione non può avere lo stesso nome di un’altra funzione. Non tutte le versioni di
awk
applicano queste limitazioni.gawk
applica solo la prima di queste restrizioni. Se viene specificata l’opzione --posix (vedi la sezione Opzioni sulla riga di comando), anche la seconda restrizione viene applicata.
Le variabili locali si comportano come la stringa vuota se vengono utilizzate dove è richiesto il valore di una stringa, e valgono zero se utilizzate dove è richiesto un valore numerico. Questo è lo stesso comportamento delle variabili regolari a cui non sia stato ancora assegnato un valore. (Ci sono ulteriori informazioni riguardo alle variabili locali; vedi la sezione Funzioni e loro effetti sul tipo di una variabile.)
Il corpo-della-funzione è composto da istruzioni awk
.
Questa è la parte più importante della definizione, perché dice quello che
la funzione dovrebbe realmente
fare. I nomi di argomento esistono per consentire al corpo della
funzione di gestire gli argomenti;
le variabili locali esistono per consentire al corpo della funzione di
memorizzare dei valori temporanei.
I nomi di argomento non sono sintatticamente distinti da quelli delle variabili locali. Invece, il numero di argomenti forniti quando la funzione viene chiamata determina quanti degli argomenti passati sono delle variabili. Quindi, se tre valori di argomento sono specificati, i primi tre nomi in lista-parametri sono degli argomenti e i rimanenti sono delle variabili locali.
Ne consegue che se il numero di argomenti richiesto non è lo stesso in tutte le chiamate alla funzione, alcuni dei nomi in lista-parametri possono essere in alcuni casi degli argomenti e in altri casi delle variabili locali. Un’altra angolatura da cui guardare questo fatto è che gli argomenti omessi assumono come valore di default la stringa nulla.
Solitamente, quando si scrive una funzione, si sa quanti nomi si intendono usare per gli argomenti e quanti si vogliono usare come variabili locali. È una convenzione in uso quella di aggiungere alcuni spazi extra tra gli argomenti e le variabili locali, per documentare come va utilizzata quella funzione.
Durante l’esecuzione del corpo della funzione, gli argomenti e i valori
delle variabili locali
nascondono, o oscurano, qualsiasi variabile dello stesso nome usata
nel resto del programma. Le variabili oscurate non sono accessibili
nel corpo della funzione, perché non c’è modo di accedere a esse
mentre i loro nomi sono stati "occupati" dagli argomenti e dalla variabili
locali. Tutte le altre variabili usate nel programma awk
possono essere accedute o impostate normalmente nel corpo della funzione.
Gli argomenti e le variabili locali esistono solo finché il corpo della funzione è in esecuzione. Una volta che l’esecuzione è terminata, ritornano accessibili le variabili che erano oscurate durante l’esecuzione della funzione.
Il corpo della funzione può contenere espressioni che chiamano altre funzioni. Tali espressioni possono perfino chiamare direttamente, o indirettamente tramite un’altra funzione, la funzione stessa. Quando questo succede, la funzione è detta ricorsiva. Il fatto che una funzione richiami se stessa è detto ricorsione.
Tutte le funzioni predefinite restituiscono un valore al loro chiamante.
Anche le funzioni definite dall’utente possono farlo, usando
l’istruzione return
,
che è descritta in dettaglio nella L’istruzione return
.
Molti dei successivi esempi in questa sezione usano
l’istruzione return
.
In molte implementazioni di awk
, compreso gawk
,
la parola chiave function
può essere
abbreviata come func
. (e.c.)
Tuttavia, POSIX specifica solo l’uso della parola chiave
function
. Questo ha alcune implicazioni di carattere pratico.
Se gawk
è in modalità POSIX-compatibile
(vedi la sezione Opzioni sulla riga di comando), la seguente
istruzione non definisce una funzione:
func foo() { a = sqrt($1) ; print a }
Invece, definisce una regola che, per ogni record, concatena il valore
della variabile ‘func’ con il valore restituito dalla funzione ‘foo’.
Se la stringa risultante è diversa dalla stringa nulla, l’azione viene eseguita.
Questo non è con ogni probabilità quello che si desidera.
(awk
accetta questo input come
sintatticamente valido, perché le funzioni, nei programmi awk
possono essere usate prima che siano state definite.62)
Per essere certi che un programma awk
sia portabile,
va sempre usata la parola chiave
function
per definire una funzione.
Questo
programma in realtà non verrà eseguito, perché foo()
risulterà
essere una funzione non definita.
Successivo: Esempio di funzione, Su: Funzioni definite dall'utente [Contenuti][Indice]