SELFHTML/Quickbar
CGI/Perl
Éléments de langage Perl
![]() |
Sous-programmes et fonctions Perl |
![]() |
|
![]() |
Pour des scripts Perl plus complexes, il est recommandé de sauvegarder certaines parties du programme dans des sous-programmes que vous définissez. De cette façon, vous pouvez mieux structurer le script. C'est judicieux avant tout pour des parties de programme qui doivent être exécutées plusieurs fois dans le cours du script. Avant donc que vous notiez une procédure assez importante plusieurs fois dans le script, vous devez mettre cette procédure dans un sous-programme et appeler ce sous-programme aux endroits désirés.
#!/usr/bin/perl $resultat = 1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9; &sortie; $resultat = sqrt(sqrt(81)); &sortie; sub sortie { print "Le résultat s'élève à: ", $resultat, "\n"; } |
Vous définissez un sous-programme avec le mot-clé sub suivi d'un nom choisi librement qui doit répondre aux conventions pour les noms de Perl. Dans l'exemple ci-dessus a été défini de la sorte un sous-programme sub sortie. La globalité du contenu du sous-programme doit figurer entre parenthèses accolades. Dans le sous-programme, vous pouvez noter autant d'instructions que vous voulez.
Avec le signe et commercial & suivi du nom du sous-programme, vous appelez le sous-programme. L'appel est une instruction en soi et doit donc, comme les autres instructions, être suivie d'un point virgule. Dans l'exemple ci-dessus figure deux fois l'instruction &sortie;. C'est ce qui appelle le sous-programme nommé sortie.
Peu importe à quel endroit du script figure un sous-programme. Lors de l'interprétation, l'interpréteur Perl exécute d'abord les instructions qui figurent en dehors des sous programmes.
Les sous-programmes sont recherchés automatiquement à leur appel.
![]() ![]() |
Vous pouvez appeler un sous programme qui recherche une valeur et la renvoie à l'instruction appelante.
#!/usr/bin/perl $x = &calcule(1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9); print $x, "\n"; sub calcule { return eval($_[0]); } |
À l'inverse d'autres langages de programmation comme C ou même Java et
JavaScript, il n'est pas nécessaire de mentionner les déclarations des
paramètres lors de la definition d'un sous-programme qui doit recevoir des
paramètres. Dans l'exemple ci-dessus le sous-programme calcule
est appelé avec un paramètre: (1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9). Le
sous-programme calcule traite ce paramètre avec la construction $_[0].
Elle cache une
variable prédéfinie,
à savoir la liste @_. Il s'agit de la liste des paramètres transmis. $_[0] accède
au premier paramètre transmis, $_[1]
au deuxième paramètre etc. Avec une instruction telle que for(@_) { print $_, "\n"; }
vous pouvez par exemple traiter tous les paramètres transmis sans devoir
connaître combien de paramètres ont été transmis.
Dans quasiment aucun langage de programmation ceci n'est aussi simple que là.
La longue expression à calculer qui est, dans l'exemple ci-dessus, transmise au sous-programme calcule est un seul paramètre. Si vous voulez transmettre plusieurs paramètres, séparez les par des virgules.
Pour qu'un sous-programme renvoie une valeur à l'instruction qui l'a appelé,
utilisez de préférence la
fonction Perl
return suivie par exemple de la mention d'une variable dont
vous voulez retourner la valeur actuelle. Dans l'exemple ci-dessus return
donne directement la valeur retournée par une fonction Perl, à savoir la
valeur retournée par la fonction eval(). Cette fonction évalue une
chaîne de caractères comme opération de calcul et retourne le résultat
obtenu.
Dans l'exemple ci-dessus, la valeur retournée par calcule est
sauvegardée dans la variable scalaire simple $x. Pour ce faire, c'est tout simplement l'appel du
sous-programme calcule qui est affecté à cette variable.
![]() ![]() |
À la différence de la plupart des autres langages de programmation, les variable définies dans un sous-programme conservent leur validité à la fin de ce sous-programme. Cela signifie que vous ne pouvez pas dans tout un même script définir deux variables du même nom. Car dès que vous voulez utiliser la deuxième variable, vous ne faites en fait que modifier le contenu actuel de la première, qui existe déjà. Cette propriété a valu à Perl la réputation de ne pas pouvoir programmer de façon structurée et propre en Perl. Il y a cependant une possibilité de limiter la durée de vie d'une variable dans un sous-programme à ce même sous-programme.
#!/usr/bin/perl &calcule(3*12); print $x, "\n"; sub calcule { $x = eval($_[0]); } |
#!/usr/bin/perl &calcule(3*12); print $x, "\n"; sub calcule { my $x = eval($_[0]); } |
Dans l'exemple 1, le sous programme calcule est d'abord appelé. Là
est définie une variable scalaire simple $x, qui calcule le premier paramètre transmis. Sinon le
sous-programme ne fait rien d'autre. Le programme principal continue
ensuite avec la sortie du contenu de $x. Et cela fonctionne - $x
n'a donc pas perdu sa valeur à la fin du sous-programme calcule.
L'exemple 2 ne se distingue de l'exemple 1 que par un seul petit mot, à savoir
le mot my devant la définition de $x. En faisant
précéder une variable scalaire simple, une liste,
un
Hash
de my dans un sous-programme, leur validité est définie
localement. Dans l'exemple 2 ci-dessus, la variable scalaire simple définie dans le
programme principal $x reste vide et rien n'est sorti.
![]() ![]() |
Perl est tellement puissant entre autres du fait que l'interpréteur Perl
connaisse une multitude de sous-programmes prédéfinis, appelés ici fonctions
Perl. Il y a des fonctions Perl pour les travaux les plus divers. Vous
apprendrez à connaître nombre d'entre elles dans les parties lire
et écrire des fichiers,
manipuler
des chaînes de caractères et des listes et
travailler
avec des nombres et le temps.
#!/usr/bin/perl print "Entrez une série de termes séparés par des virgules:\n"; $entree = <STDIN>; @liste = split(/,/, $entree); @listetriee = sort(@liste); print "Merci! Et maintenant, voici une sortie des termes triés alphabétiquement:\n"; for(@listetriee) { if(/\n/) { chop($_); } print $_, "\n"; } |
La première fonction Perl de l'exemple ci-dessus est print. La plupart du temps, les fonctions Perl sont appelées à vrai dire comme en C ou dans les langages parents avec des parenthèses (), mais ce n'est pas indispensable. Pour des fonctions aussi souvent utilisées que print l'utilisation des parenthèses est donc entre temps tombée victime de la flemme à les écrire. Si par exemple, à la place de l'appel de la fonction sort(@liste) (voir exemple ci-dessus) vous notez sort @Liste, Perl reconnaît ça aussi.
En règle générale, une fonction Perl reçoit des paramètres avec lesquels
elle doit faire quelque chose. Ainsi dans l'exemple, "Entrez
une série de termes séparés par des virgules:\n"; est un paramètre
qui est transmis à la fonction print. Plus bas dans l'exemple,
la fonction sort reçoit comme paramètre la liste
nommée @liste. Si vous transmettez plusieurs paramètres à une
fonction, séparez les par des virgules.
En général, les fonctions Perl retournent aussi une valeur. Dans l'exemple ci-dessus, la fonction Perl sort prend en charge le tri de la liste transmise et retourne une nouvelle liste, à savoir celle des éléments triés.
Deux autres fonctions Perl dans l'exemple ci-dessus sont split et chop.
La fonction split peut rechercher, dans une chaîne de caractères, des
signes ou des chaînes de caractères que vous transmettez comme paramètre à
l'aide d'une expression régulière. En outre la chaîne de caractères ou la variable scalaire simple
contenant la chaîne de caractères correspondante doit
encore être transmise. Alors split retourne une liste d'éléments
ayant été séparés les uns des autres par la règle de séparation indiquée.
La fonction chop retire le dernier signe d'une chaîne de caractères.
Ceci est souvent judicieux étant donné que les chaînes de caractères en Perl
reçoivent souvent automatiquement un caractère de contrôle pour le passage à
la ligne (\n).
![]() | |
après:![]() |
![]() |
avant:![]() |
![]() |
SELFHTML/Quickbar
CGI/Perl
Éléments de langage Perl
Serge François, 13405@free.fr