SELFHTML/Quickbar  CGI/Perl  Éléments de langage Perl


Sous-programmes et fonctions Perl

Cette page est un document avec du texte et des informations

 Sous-programmes
 Sous-programmes avec mention de paramètres et valeur retournée
 Variables locales
 Fonctions Perl

 

Sous-programmes

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.

Exemple:

#!/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";
}

Explication:

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.

Attention:

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.

 

Sous-programmes avec mention de paramètres et valeur retournée

Vous pouvez appeler un sous programme qui recherche une valeur et la renvoie à l'instruction appelante.

Exemple:

#!/usr/bin/perl

$x = &calcule(1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9);
print $x, "\n";

sub calcule
{
 return eval($_[0]);
}

Explication:

À 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.

 

Variables locales

À 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.

Exemple 1:

#!/usr/bin/perl

&calcule(3*12);
print $x, "\n";

sub calcule
{
 $x = eval($_[0]);
}

Exemple 2:

#!/usr/bin/perl

&calcule(3*12);
print $x, "\n";

sub calcule
{
 my $x = eval($_[0]);
}

Explication:

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.

 

Fonctions Perl

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.

Exemple:

#!/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";
 }

Explication:

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: Lire et écrire des fichiers
avant: Caractères de contrôle et notations particulières
 

SELFHTML/Quickbar  CGI/Perl  Éléments de langage Perl

© 1998 Stefan Münz / © 2001 Traduction  Serge François, 13405@free.fr