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


9.2.2 Un esempio di definizione di funzione

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"].


Note a piè di pagina

(63)

Verso la fine del 2012.


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