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


9.2.4 L’istruzione return

Come visto in parecchi esempi precedenti, il corpo di una funzione definita dall’utente può contenere un’istruzione return. Quest’istruzione restituisce il controllo a quella parte del del programma awk che ha effettuato la chiamata. Può anche essere usata per restituire un valore da usare nel resto del programma awk. Questo è un esempio:

return [espressione]

La parte espressione è opzionale. Probabilmente per una svista, POSIX non definisce qual è il valore restituito, se si omette espressione. Tecnicamente parlando, questo rende il valore restituito indefinito, e quindi, indeterminato. In pratica, tuttavia, tutte le versioni di awk restituiscono semplicemente la stringa nulla, che vale zero se usata in un contesto che richiede un numero.

Un’istruzione return senza una espressione è considerata presente alla fine di ogni definizione di funzione. Quindi, se il flusso di esecuzione raggiunge la fine del corpo della funzione, tecnicamente la funzione restituisce un valore indeterminato. In pratica, restituisce la stringa nulla. awk non emette alcun messaggio di avvertimento se si usa il valore restituito di una tale funzione.

Talvolta può capitare di scrivere una funzione per quello che fa, non per quello che restituisce. Una tale funzione corrisponde a una funzione void in C, C++, o Java, o a una procedure in Ada. Quindi, può essere corretto non restituire alcun valore; basta fare attenzione a non usare poi il valore restituito da una tale funzione.

Quello che segue è un esempio di una funzione definita dall’utente che restituisce un valore che è il numero più alto presente tra gli elementi di un vettore:

function massimo(vettore,   i, max)
{
     for (i in vettore) {
          if (max == "" || vettore[i] > max)
               max = vettore[i]
     }
     return max
}

La chiamata a massimo() ha un solo argomento, che è il nome di un vettore. Le variabili locali i e max non vanno intese come argomenti; nulla vieta di passare più di un argomento a massimo() ma i risultati sarebbero strani. Gli spazi extra prima di i nella lista dei parametri della funzione indicano che i e max sono variabili locali. È consigliabile seguire questa convenzione quando si definiscono delle funzioni.

Il programma seguente usa la funzione massimo(). Carica un vettore, richiama massimo(), e quindi elenca il numero massimo contenuto in quel vettore:

function massimo(vettore,   i, max)
{
     for (i in vettore) {
          if (max == "" || vettore[i] > max)
               max = vettore[i]
     }
     return max
}

# Carica tutti i campi di ogni record in numeri.
{
     for (i = 1; i <= NF; i++)
          numeri[NR, i] = $i
}

END {
     print massimo(numeri)
}

Dato il seguente input:

 1 5 23 8 16
44 3 5 2 8 26
256 291 1396 2962 100
-6 467 998 1101
99385 11 0 225

il programma trova (come si può immaginare) che 99.385 è il valore più alto contenuto nel vettore.


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