La structure générale d'une fonction est:
sub fonction { # block }
block
est le corps de la fonction, c'est à dire les
actions à exécuter. Chaque action est séparée d'une autre par
';
'. Le caractère '#
' permet de commenter le code
écrit. Tout ce qui suit ce caractère jusqu'au prochain retour
à la ligne n'est pas interprété.
sub hello { print "Hello World !\n"; } hello(); # affiche 'Hello World !\n' hello; # idem &hello; # idem do hello; # idem
L'exemple précédent nous montre comment créer une fonction et comment l'exécuter de quatre manières différentes.
sub true { return 1; } $t = true; # $t vaut 1; $t = true(); # idem
La fonction suivante est équivalente:
sub true { 1; } $t = true; # $t vaut 1
Les deux exemples ci-dessus sont équivalents. En fait Perl retourne la valeur de la dernière expression de la fonction exécutée. Cette valeur n'est pas seulement entière. Il est possible de retourner des tables ou des tables de hash.
sub foo { ... ... @tab = (1, 2, 3); return @tab; # ou return (1, 2, 3); } sub bar { ... ... %hash = ( 'i' => 1, 'ii' => 2, ); %hash; }
Losque return est manquant, la valeur de la dernière expression est retournée.
Les arguments d'une fonction se présentent sous la forme d'une table.
Elle est notée @_
. Donc:
$_[0]; # premier argument. $_[$#_]; # dernier argument : # $#_ est le dernier indice dans le tableau
Bien souvent on connait à l'avance le nombre d'arguments d'une
fonction. Aussi on privilégiera l'usage de @_
à
$_[0]
, etc.
sub sum { $sum = 0; foreach (@_) # parcours de tous les arguments { $sum += $_; } $sum; } sum(10, 20, 30, "40"); # retourne 100
Rappel: Perl fait les conversions implicitement.
sub hello { ($nom, $prenom) = @_; print "Hello $nom $prenom\n"; } hello("FORCIOLI", "Alain"); # affiche 'Hello FORCIOLI Alain\n'
Cet usage est préférable car il évite une ligne complexe du genre:
($nom, $prenom) = ($_[0], $_[1]);
Il existe deux fonctions qui permettent de rendre locale une variable.
$a = "a"; { local($a) = "b"; # $a est locale au 'scope' # (par exemple: {...}) print "$a\n"; # affiche 'b\n' } print "$a\n"; # affiche 'a\n'
L'exemple précédent montre que les variables $a
ont des
valeurs différentes. La seconde déclaration (utilisant local()
pour définir $a
) rend $a
visible uniquement à
l'intérieur des crochets. Nous avons deux espaces de noms en notre
présence. Dans le premier nous avons $a
valant a
,
dans le second nous avons $a
égale à b
.
Le manuel (section perlfunc) préconise tout de même l'emploi de
my()
, qui apparemment donne un sens plus fort au terme
locale. En effet dans un contexte orienté objet ou de module,
une variable déclarée avec local
, est connue de tout le
scope (scope : espace de nommage, compris entre crochets) de
module ou de la classe. Tandis qu'une variable déclarée avec my
est connue uniquement à l'intérieur du scope ou elle est
définie.