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


Note a piè di pagina

(63)

Verso la fine del 2012.


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