Successivo: Chiamata di una funzione, Precedente: Sintassi delle definizioni, Su: Funzioni definite dall'utente [Contenuti][Indice]
Ecco un esempio di funzione definita dall’utente, di nome
stampa_num()
, che
ha come input un numero e lo stampa in un formato specifico:
function stampa_num(numero) { printf "%6.3g\n", numero }
Per comprenderne il funzionamento, ecco una regola awk
che usa
la funzione stampa_num()
:
$3 > 0 { stampa_num($3) }
Questo programma stampa, nel nostro formato speciale, tutti i terzi campi nei record in input che contengono un numero positivo. Quindi, dato il seguente input:
1.2 3.4 5.6 7.8 9.10 11.12 -13.14 15.16 17.18 19.20 21.22 23.24
questo programma, usando la nostra funzione per formattare i risultati, stampa:
5.6 21.2
La funzione seguente cancella tutti gli elementi in un vettore (si ricordi che gli spazi bianchi in soprannumero stanno a indicare l’inizio della lista delle variabili locali):
function cancella_vettore(a, i) { for (i in a) delete a[i] }
Quando si lavora con vettori, è spesso necessario cancellare
tutti gli elementi in un vettore e ripartire con una nuova lista di elementi
(vedi la sezione L’istruzione delete
).
Invece di dover ripetere
questo ciclo ogni volta che si deve cancellare
un vettore, un programma può limitarsi a effettuare una chiamata
a cancella_vettore()
.
(Questo garantisce la portabilità. L’uso di ‘delete vettore’
per cancellare
il contenuto di un intero vettore è un’aggiunta relativamente
recente63
allo standard POSIX.)
Quello che segue è un esempio di una funzione ricorsiva. Prende come parametro di input una stringa e restituisce la stringa in ordine inverso. Le funzioni ricorsive devono sempre avere un test che interrompa la ricorsione. In questo caso, la ricorsione termina quando la stringa in input è già vuota:
function rev(stringa) { if (stringa == "") return "" return (rev(substr(stringa, 2)) substr(stringa, 1, 1)) }
Se questa funzione è in un file di nome rev.awk, si può provare così:
$ echo "Non v'allarmate!" | > gawk -e '{ print rev($0) }' -f rev.awk -| !etamralla'v noN
La funzione C ctime()
prende una marcatura temporale e la restituisce
come una stringa,
formattata come già sappiamo.
Il seguente esempio usa la funzione predefinita strftime()
(vedi la sezione Funzioni per gestire marcature temporali)
per creare una versione awk
di ctime()
:
# ctime.awk # # versione awk della funzione C ctime(3) function ctime(ts, format) { format = "%a %e %b %Y, %H.%M.%S, %Z" if (ts == 0) ts = systime() # usare data e ora correnti per default return strftime(format, ts) }
Si potrebbe pensare che la funzione ctime()
possa usare
PROCINFO["strftime"]
come stringa di formato. Sarebbe un errore, perché si suppone che
ctime()
restituisca data e ora formattati in maniera standard,
e qualche codice a livello utente potrebbe aver modificato in precedenza
PROCINFO["strftime"]
.
Successivo: Chiamata di una funzione, Precedente: Sintassi delle definizioni, Su: Funzioni definite dall'utente [Contenuti][Indice]