En Perl la définition d'une fonction est simple. A chaque fois on retrouve la structure suivante :
sub NomDeFonction{
...
}.
Exemple de programme :
$AireDuCercle = Aire(56);
print "$AireDuCercle\n";
sub Aire{
$rayon = $_[0];
return ( 3.1415 * ($rayon ** 2) );
}
Tout les paramètres sont passés à la fonction via le vecteur @_. On a accès au nombre de paramètres en assignant @_ à un scalaire, les éléments du vecteurs sont accessibles soit par leurs références $_[x] ou en assignant un vecteur dédié dans la fonction. La modification de la référence d'un paramètre entraîne sa modification dans la suite du programme.
Les scripts suivant illustrent ces notions.
argu(1,2,3);
argu("bla");
argu(1..19);
sub argu{
$nombre = @_;
print "Nombre d\'arguments : " . $nombre;
}
aire_rect(5,6);
aire_rect(6,8);
sub aire_rect{
($largeur, $longueur) = @_;
$aire = $largeur * $longueur;
print "surface : $aire\n";
}
@vecteur = (1..5);
print "Avant l\'appel à la fonction \@vecteur = @vecteur\n";
fonction(@vecteur);
print "Après l\'appel à la fonction \@vecteur = @vecteur\n";
sub fonction{
$_[0] ="A";
$_[3] ="B";
}
La portée des variables
Il est possible de contrôler la portée des variables à l'aide des fonctions my() et local(). Une variable my ne porte que dans la fonction elle-même, une variable locale porte sur la fonction où elle est déclarée et les fonctions qui sont appelées à l'intérieur de cette fonction.
Le script suivant illustre ces notions :
fonction("AAAA","BBBB");
sub fonction{
local( $var1)=$_[0];
my($var2)=$_[1];
print ("Dans fonction : \$var1 = $var1\n");
print ("Dans foncton : \$var2 = $var2\n");
sous_fonction();
print ("Dans fonction : \$var1 = $var1\n");
print ("Dans foncton : \$var2 = $var2\n");
}
sub sous_fonction{
print ("Dans sous_fonction : \$var1 = $var1\n");
print ("Dans sous_foncton : \$var2 = $var2\n");
$var1 = "CCCC";
$var2 = "DDDD";
print ("Dans sous_fonction : \$var1 = $var1\n");
print ("Dans sous_foncton : \$var2 = $var2\n");
}
Une fonction privée est une fonction déclarée dans le corps d'une autre fonction et uniquement accessible à l'intérieur de celui-ci.
Voici un exemple d'utilisation d'une fonction privée.
$res = pyth(10,10);
print("\$res = $res\n");
sub pyth{
($var1, $var2) = @_;
$carre = sub{
return($_[0] ** 2);
};
return(&$carre($var1) + &$carre($var2));
}