Successivo: , Su: Funzioni definite dall'utente   [Contenuti][Indice]


9.2.1 Come scrivere definizioni e cosa significano

Risponde al vero affermare che la sintassi di awk per la definizione di variabili locali è semplicemente atroce.

Brian Kernighan

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.


Note a piè di pagina

(62)

Questo programma in realtà non verrà eseguito, perché foo() risulterà essere una funzione non definita.


Successivo: , Su: Funzioni definite dall'utente   [Contenuti][Indice]