Programmazione  »  Guide  »  Guida Perl 

Subroutines



Fino ad adesso, tutti i "programmi" che siamo in grado di scrivere sono abbastanza 'lineari', verrebbero cioè eseguiti dall'inizio alla fine, riga dopo riga, senza alcun test o loop, tutti in un unico blocco.
E' comunque possibile definire le nostre funzioni (o procedure, o subroutines o come volete chiamarle) in perl, e poi richiamarle come si richiamano le normali funzioni del perl.

Il modo di definire una funzione è questo:

sub nome_della_funzione {
contenuti;
della;
funzione;
}

Tale funzione verrà richiamato come &nome_della_funzione se non si vogliono aggiungere argomenti, &nome_della_funzione($argomenti, @vanno, %qui) per richiamarla con gli argomenti.
La "&" è il carattere che identifica le subroutines, allo stesso modo in cui $ definisce gli scalari.

Le subroutines possono essere definite in qualsiasi punto del programma, eccetto all'interno di altre. [Questo vale per il perl4, nel 5 si possono avere subroutine in altre subroutines, sub (= subroutines) senza nome, e non è necessario il "&" per richiamarle].

Le sub possono essere utilizzate prima di essere definite.

ex: #!/usr/bin/perl
$bla=3;
&showbla;
$bla=4;
sub showbla {
print "bla è $blan";
}
&showbla

Questo esempio assegna 3 a $bla, chiama la sub, assegna 4 a $bla, poi la richiama; non importa il posto in cui essa è definita.
Nella pratica le sub si tengono all'inizio dello script, attorniate con l'inizializzazione della variabili che servono, ed in seguito il resto del codice. Ma il perl non obbliga mai ad essere logici o chiari.

All'interno di una sub, possiamo aver accesso ai parametri passati (se ce ne sono) tramite lo speciale array @_ . Così il primo valore passato alla sub sarà $_[0], il secondo $_[1] e così via.

sub printfirstargument {
print $_[0], "n";
} sub printnumberofarguments {
print $#_ +1, "n";
} sub addone {
$_[0] = $[0] +1;
}
$bla = 3;
&addone($bla);

Inoltre, ogni funzione restituisce un valore. che è l'ultima espressione che era stata valutata. Da una sub, si può ritornare indietro ad un determinato punto con il comando "return", che tornerà al punto fornito come argomento.

sub one { if ($_[0] == 1) {
controlla che il primo argomento sia 1
return "one";
se è cosi', restituisce la stringa "one"
} else {
altrimenti ...
return "not one";
restituisce la stringa "not one"
}
chiude "if/else"
}
chiude la sub
print &one(1), ", ", &one(3), "n";
visualizza "one, not one"

Vediamo ora un esempio più "alla mano": questo script leggerà i valori in input e ne stamperà la media aritmetica.

#!/usr/bin/perl
sub media {
local($n, $somma, $media);
foreach $n (@_) {
$somma += $n;
}
$media = $somma/($#_ +1);
return ($media);
}
print "Inserisci i numeri:n";
@numeri = <StdIN>;
chop (@numeri);
$media = &media(@numeri);
print "Media = $median";

Ultimi articoli Programmazione

Windows 8 Store, un posto in prima fila

La pre-certificazione che permetterà di avere le nostre applicazioni...

La concorrenza con C++11, async e la libreria Threading

La libreria Threading e i principali costrutti per sfruttare il...

Visual Studio 11 beta, le novità

Le caratteristiche più interessanti introdotte nella beta di Visual...

Windows 8, WinRT API e applicazioni Metro Style

Come creare una semplicissima interazione in stile Metro con C++...

C++11, la libreria standard

Le funzioni sugli insiemi e i contenitori mutuati dalle estensioni...

Altri articoli

Guide Programmazione

Azure, una nuvola tanti linguaggi

Entrare con semplicità ed efficacia nel mondo di Windows Azure e...

Guida Antipattern

Come evitare le cattive abitudini, le worst practices e le trappole...

RESTful Web Services - La Guida

Dai principi ispiratori del Web programmabile e delle architetture...

Altre guide

Newsletter @Programmazione

Ogni settimana, direttamente nella tua e-mail: articoli, script e guide su Java, Visual Basic, VB.Net ed i più diffusi linguaggi di programmazione.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto