Successivo: Precisazioni sulle funzioni, 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 Cancellazione).
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 Funzioni di tempo)
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: Precisazioni sulle funzioni, Precedente: Sintassi delle definizioni, Su: Funzioni definite dall'utente [Contenuti][Indice]