# Perl/Funzioni

Perl
Copertina Bibliografia Tutti i moduli · Sviluppo
    CopertinaPerl/Copertina
* IntroduzionePerl/Introduzione
* C'è Perl?Perl/C'è Perl?
* Primo programma: Ciao Mondo!Perl/Primo programma: Ciao Mondo!
** Primo programma in un filePerl/Primo programma in un file
* VariabiliPerl/Variabili
** Variabili scalariPerl/Variabili scalari
** Variabili vettoriPerl/Variabili vettori
** Variabili hashPerl/Variabili hash
* IstruzioniPerl/Istruzioni
** Istruzioni minimePerl/Istruzioni minime
** Istruzioni compostePerl/Istruzioni composte
** Istruzioni racchiuse o bloccoPerl/Istruzioni racchiuse o blocco
** Istruzioni etichettaPerl/Istruzioni etichetta
** Istruzioni particolari su blocchi o etichettePerl/Istruzioni particolari su blocchi o etichette
** Istruzioni decisionaliPerl/Istruzioni decisionali
** CicliPerl/Cicli
* Applicare la teoriaPerl/Applicare la teoria
* FunzioniPerl/Funzioni
* Funzioni Native sulle variabiliPerl/Funzioni Native sulle variabili
** Funzioni Native su scalariPerl/Funzioni Native su scalari
** Funzioni Native su vettoriPerl/Funzioni Native su vettori
** Funzioni Native su hashPerl/Funzioni Native su hash
* FilePerl/File
* Espressioni regolariPerl/Espressioni regolari
** Espressioni regolari (oltre)Perl/Espressioni regolari (oltre)
** Espressioni regolari (contesto)Perl/Espressioni regolari (contesto)
Modifica il sommario
Le funzioni sono dei raggruppamenti di istruzioni "tipo i blocchi" ma con delle caratteristiche in più. Queste sono:
* un nome (assimilabile ad un'etichetta)
* eventuali parametri
* eventuali valori di ritorno
per indicare una funzione il Perl adotta la parola chiave sub (in inglese subrutine).
esempio :
nell'esempio indicato la funzione "miafunzione" non usa parametri e non esplicita un valore di ritorno.
I parametri passati ad una funzione sono variabili. Occorre però prestare particolare attenzione al fenomeno della linearizzazione nel caso di array e hash.

## Il vettore particolare @_

Quando una funzione è invocata, eventuali parametri sono messi nel vettore particolare @_. Questa funzionalità è automatica pertanto ci si ritroverà queste informazioni in questo vettore.
Nel caso precedente che si è invocato miafunzione senza parametri pertanto @_ è vuoto.
L'interprete Perl applica a questo vettore speciale qualsiasi funzione che vuole o no dei parametri. quindi se si vedono nel codice comandi tipo
in realtà è come se il codice scritto fosse:

## I parametri

I parametri di una funzione sono delle informazioni necessarie ad una funzione per svolgere il proprio compito. Vengono messi dopo la chiamata della funzione e sono separati da una virgola. La dichiarazione rimane inalterata ma la chiamata invece si modifica:
vediamo questo esempio:
che produrrà:
Come si può notare nella funzione NON si è specificato alcun argomento.Tutti questi sono stati messi in un array "speciale" chiamato @_. In questo array è possibile riottenere tutti i parametri passati.
Problema : se passo due array/hash ad una funzione come faccio a "tenerli" separati? (Vi ricordate del problema della linearizzazione?)
Soluzione: occorre usare i reference.Infatti non è possibile in un altro modo di evitare i problemi di linearizzazione.
Problema : se devo passare 2 scalari ed in array/hash come faccio ?
Soluzione: il parametro array/hash si mette per ultimo e gli scalari per primi : in questo modo dopo aver preso gli scalari (per esempio usando shift) si otterrà che i dati contenuti in @_ sono i dati contenuti nell'array/hash.

## Il ritorno

Ogni funzione ha un valore di ritorno. Se non specificato è il valore di ritorno dell'ultima istruzione eseguita:
che produrrà :
quindi un valore equiparabile ad un true.
Se si vuole invece specificare un valore allora useremo return :
che produrrà :
Vediamo ora questo fenomeno:
che produrrà :

## Il ritorno a seconda del contesto

Se assegniamo il valore di ritorno di una funzione ad una variabile scalare avremo un "contesto" scalare. Se assegniamo il valore di ritorno di una funzione ad una variabile array/hash (lista) avremo un "contesto" lista.
Il contesto non vincola la funzione ma consente al programmatore di diversificare il valore di ritorno. Quindi in un contesto lista il programmatore si aspetta che la funzione ritorni più argomenti, mentre in un contesto scalare il programmatore si aspetta che la funzioni torni un unico valore.
Per diversificare si usa la funzione wantarray che vale 1 se il contesto in cui è valutata la funzione in uso è una lista.
Vediamo l'esempio
che produce:

## Identificare una funzione

Il Perl ha un simbolo per identificare una funzione ed è il "&".Questo simbolo alla versione 5.6.xx non è più utilizzato per le chiamate dirette ma è rimasto per compatibilità con il passato. Quindi si può trovare la chiamata a funzione anche come:
L'uso di questo simbolo è obbligatorio per far comprendere al linguaggio come utilizzare una variabile quando si vuole che questa si comporti come una funzione. Per chiarimenti proseguire con la lettura.

## Funzione anonima

Precedentemente alle variabili si è visto come è possibile assegnare diverse cose. Fra queste ci sono anche le funzioni:
Da notare che non c'è il nome dopo sub e che il nome "nell'uso" è stato sostituito dal nome della variabile (con il $ davanti !)

## Una Funzione puntando al nome

Guardiamo ora questo codice:
Quindi in questo modo si è sostituito il "nome" della funzione con la variabile $f. Prestate molta attenzione alla sintassi. Infatti $f viene assegnato un reference "\" alla funzione "&" chiamata "estrazione". Ben diverso è una chiamata, così fatta:
Infatti in questo caso verrà interpretato come: $f viene assegnato un reference "\" al valore di ritorno della funzione "&" chiamata "estrazione" con parametri nulli. Infatti &estrazione da luogo alla chiamata della funzione così come &$f. Mentre \&estrazione fa solo un riferimento ma non invoca la funzione.
Dato che $f è una variabile è possibile usarla come un reference (infatti lo è), pertanto è possibile usare la sintassi -> :

## Funzioni con ritorno a funzione (nome o anonima)

Questo caso è alquanto raro, tuttavia è interessante per capire cosa avviene, in quanto rappresenta una possibilità offerta dal linguaggio Perl. Se si torna una funzione poi questa deve essere lanciata per poter ottenere un risultato. Vediamo ora questo codice:
che produce :
Da notare che nel ritorno della funzione estrai (costituito da un'altra funzione) ci sono dei dati passati durante l' invocazione, che vengono ereditati dalla funzione ritornata. Questo è possibile perché la funzione viene "cablata" con il valore della variabile nel codice della funzione ritornata. Come detto all'inizio è preferibile usare, anche e soprattutto per questioni di manutenzione, le chiamate a funzioni esplicite piuttosto che nella forma anonima/nominale.