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";