Successivo: , Precedente: , Su: Espressioni   [Contenuti][Indice]


6.4 Chiamate di funzione

Una funzione è un nome per richiedere un particolare calcolo. Il nome permette di richiamare la funzione da qualsiasi punto del programma. Per esempio, la funzione sqrt() calcola la radice quadrata di un numero.

Un certo numero di funzioni sono predefinite, ossia sono disponibili in ogni programma awk. La funzione sqrt() è una di queste. Vedi la sezione Funzioni predefinite per un elenco di funzioni predefinite e per le loro rispettive descrizioni. In aggiunta, l’utente può definire delle funzioni da usare nel proprio programma. Vedi la sezione Funzioni definite dall’utente per istruzioni su come farlo. Infine, gawk permette di scrivere funzioni in C o in C++ che possono essere chiamate dal proprio programma (vedi la sezione Scrivere estensioni per gawk).

Una funzione viene utilizzata invocandola tramite un’espressione di chiamata di funzione, che consiste nel nome della funzione seguito immediatamente da una lista di argomenti tra parentesi. Gli argomenti sono espressioni che forniscono i materiali grezzi su cui opera la funzione. Quando ci sono più argomenti, questi sono separati da virgole. Se non ci sono argomenti, basta scrivere ‘()’ dopo il nome della funzione. Gli esempi che seguono mostrano chiamate di funzione con e senza argomenti:

sqrt(x^2 + y^2)        un argomento
atan2(y, x)            due argomenti
rand()                 nessun argomento

ATTENZIONE: Non ci dev’essere nessuno spazio tra il nome della funzione e la parentesi aperta! Un nome di funzione definita dall’utente può essere scambiata per il nome di una variabile: uno spazio renderebbe l’espressione simile alla concatenazione di una variabile con un’espressione racchiusa tra parentesi. Per le funzioni predefinite, lo spazio prima delle parentesi non crea problemi, ma è meglio non prendere l’abitudine di usare spazi per evitare errori con le funzioni definite dall’utente.

Ogni funzione richiede uno specifico numero di argomenti. Per esempio, la funzione sqrt() dev’essere chiamata con un solo argomento, il numero del quale si vuole estrarre la radice quadrata:

sqrt(argomento)

Alcune delle funzioni predefinite hanno uno o più argomenti opzionali. Se questi argomenti non vengono forniti, le funzioni usano un valore di default appropriato. Vedi la sezione Funzioni predefinite per tutti i dettagli. Se sono omessi argomenti in chiamate a funzioni definite dall’utente, tali argomenti sono considerati essere variabili locali. Il valore di tali variabili locali è la stringa nulla se usate in un contesto che richiede una stringa di caratteri, e lo zero se è richiesto un valore numerico (vedi la sezione Funzioni definite dall’utente).

Come funzionalità avanzata, gawk prevede la possibilità di effettuare chiamate di funzione indirette, il che permette di scegliere la funzione da chiamare al momento dell’esecuzione, invece che nel momento in cui si scrive il codice sorgente del programma. Si rimanda la trattazione di questa funzionalità a un secondo momento; si veda Chiamate indirette di funzione.

Come ogni altra espressione, la chiamata di funzione ha un valore, chiamato spesso valore di ritorno, che è calcolato dalla funzione in base agli argomenti dati. In quest’esempio, il codice di ritorno di ‘sqrt(argomento)’ è la radice quadrata di argomento. Il seguente programma legge numeri, un numero per riga, e stampa la radice quadrata di ciascuno:

$ awk '{ print "La radice quadrata di", $1, "è", sqrt($1) }'
1
-| La radice quadrata di 1 è 1
3
-| La radice quadrata di 3 è 1.73205
5
-| La radice quadrata di 5 è 2.23607
Ctrl-d

Una funzione può avere anche effetti collaterali, come assegnare valori a certe variabili o effettuare operazioni di I/O. Questo programma mostra come la funzione match() (vedi la sezione Funzioni di manipolazione di stringhe) cambia le variabili RSTART e RLENGTH:

{
    if (match($1, $2))
        print RSTART, RLENGTH
    else
        print "non uguali"
}

Qui vediamo un’esecuzione di esempio:

$ awk -f matchit.awk
aaccdd  c+
-| 3 2
pippo     pluto
-| non uguali
abcdefg e
-| 5 1

Successivo: , Precedente: , Su: Espressioni   [Contenuti][Indice]