SELFHTML

Sous-programmes

Page d'information: vue d'ensemble

vers le bas Créer des sous-programmes
vers le bas Appeler des sous-programmes avec des paramètres
vers le bas Valeurs retournées pour les sous-programmes

 vers le bas 

Créer des sous-programmes

Pour des scripts Perl plus complexes, il est recommandé de sauvegarder certaines parties du programme dans des sous-programmes ou fonctions - ce qu'on appelle routines 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 d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test</title></head><body>\n";

my $resultat = 1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9;
sortie();
$resultat = sqrt(sqrt(81));
sortie();

print "</body></html>\n";


sub sortie {
 print "Le r�sultat est: <b>$resultat</b><br>\n";
}

Explication:

Dans l'exemple un sous programme nommé sortie est établi. Un sous-programme commence avec le mot-clé sub. Derrière suit un nom librement choisi qui doit satisfaire aux Autre page d'information règles pour l'attribution de noms de Perl. Tout le contenu doit figurer dans des parenthèses accolades. Vous pouvez y noter les instructions que vous désirez en nature et en nombre.

Avec son nom suivi de parenthèses, vous appelez le sous-programme. L'appel est une instruction distincte et doit donc comme toute autre instruction se terminer par un point virgule. Dans l'exemple ci-dessus, on trouve deux fois l'instruction sortie();. Par celle-ci, le sous-programme nommé sortie est appelé.

Attention:

Les instructions des sous-programmes ne sont exécutées que lorsque ceux-ci sont appelés.

Peu importe à quel endroit du script figure un sous-programme. Il peut en principe figurer partout hors de tout autre sous programme. Il est toutefois judicieux de noter tous les sous-programmes optiquement à part du programme principal exécuté directement.

Lors de l'appel, vous pouvez également noter à la place de Routine();, &Routine; ou bien &Routine();. La première façon est cependant celle qui est recommandée avant tout lors d'appels sans parenthèses, des erreurs peuvent être générées.

Quand vous travaillez - comme dans l'exemple ci-dessus - avec use strict;, vous devez déclarer toutes les variables avant leur première utilisation. Ce faisant, le domaine de validité d'une variable est aussi limité. Un sous-programme représente un bloc et un domaine de validité distinct. Quand donc vous déclarez une variable par exemple avec my $variable=1; à l'intérieur d'un sous-programme et que vous essayez de sortir son contenu dans le programme principal avec print $variable, cela mène à un message d'erreur étant donné que $variable n'est pas connu dans le programme principal. Il en va différemment pour l'inverse: Les variables qui sont déclarées dans le programme principal sont également disponibles dans les sous programmes. Dans l'exemple ci-dessus, cette possibilité a été mise à profit. En général, il est également préférable pour cette raison pour des scripts plus importants de mettre un maximum de code avec des déclarations de variables dans les sous-programmes pour en avoir le moins possible dans le programme principal. Car les variables globales globale ont tendance à conduire plus facilement à des erreurs logiques dans le déroulement du programme étant donné qu'elles sont moins faciles à contrôler que les variables limitées aux sous-programmes.

 vers le hautvers le bas 

Appeler des sous-programmes avec des paramètres

À son appel, vous pouvez transmettre des données à un sous programme, données que le sous-programme doit traiter.

Exemple d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test</title></head><body>\n";

formatHTML("Hello utilisateur","h1");
formatHTML("Ton navigateur se pr�tend �tre  $ENV{HTTP_USER_AGENT}","i");

print "</head></html>\n";


sub formatHTML {
 my $contenu = shift;
 my $Format = shift;
 print "<$Format>$contenu</$Format>";
}

Explication:

L'exemple définit un sous-programme nommé formatHTML. Dans la partie supérieure du script vous pouvez voir comment ce sous programme est appelé. Avec l'appel formatHTML("Hello utilisateur","h1"); deux paramètres sont transmis au sous-programme. Car le sous-programme a pour tâche de sortir une construction HTML comprenant un repère d'ouverture, un contenu et un repère de fermeture avec le texte transmis et le nom d'élément HTML.

Le sous-programme attend donc deux paramètres. Il est intéressant de voir comment il réclame les paramètres. Pour cela, il utilise simplement la fonction Perl Autre page d'information shift et affecte la valeur qu'elle renvoie à une scalaire. Pour comprendre cette instruction, il est important de savoir que des paramètres transmis à un sous-programme se trouvent dans la Autre page d'information variable prédéfinie @_. Cette variable contient la liste de tous les paramètres ayant été transmis au sous-programme. Le premier paramètre se trouve alors dans $_[0], le deuxième dans $_[1] etc... Il est cependant plus élégant de chercher les paramètres avec la fonction shift. Étant donné qu'aucun paramètre n'est transmis à la fonction shift lorsqu'elle est appelée, la fonction s'applique automatiquement à la variable prédéfinie @_. La fonction retire le premier élément de la liste et le retourne. En répétant l'appel de la fonction shift, un sous-programme peut chercher au fur et à mesure les paramètres qui lui ont été transmis.

Le sous-programme de l'exemple, se prend donc le premier paramètre et le sauvegarde dans $contenu et le deuxième dans $Format. Ensuite, il crée une sortie print et y construit la construction HTML désirée. À chaque appel du programme principal, le sous-programme met donc en œuvre une sortie dans le navigateur avec les paramètres transmis.

Attention:

Vous ne devez fixer nulle part combien et quels paramètres un sous-programme peut se voir transmettre. Un sous-programme qui ne sait pas combien de paramètres lui sont transmis, peut par exemple traiter la liste des paramètres transmis avec une Autre page d'information boucle foreach sous la forme foreach(@_).

 vers le hautvers le bas 

Valeurs retournées pour les sous-programmes

Les sous-programmes peuvent renvoyer des valeurs. Les sous-programmes qui se voient transmettre des paramètres, qui en font quelque chose et renvoient les données après traitement, correspondent plutôt à ce qu'on entend par fonction. Les Chapitre: vue d'ensemble fonctions Perl faisant partie de Perl suivent ce schéma, ainsi que la plupart des sous-programmes, que vous pouvez appeler dans les Chapitre: vue d'ensemble modules travaillent en tant que fonctions.

Exemple d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print entete_HTML();
print code_HTML("h1","Bonjour!","font-size:24pt; color:red");
print code_HTML("p","Comment ça va?","");
print pied_HTML();


sub entete_HTML {
 my $entete = "Content-type: text/html\n\n".
  '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'."\n".
  "<html><head><title>Test</title></head><body>\n";
 return($entete);
}

sub pied_HTML {
my $pied = "<hr>\n<script type=\"text/javascript\"><!--\n".
            "document.write(\"adresse URL: \"+document.URL);\n//--></script>\n".
            "</body></html>\n";
 return($pied);
}

sub code_HTML {
 my $repere = shift;
 my $contenu = shift;
 my $Style = shift;
 unless(defined($Style) and length($Style)) {
  return("<$repere>$contenu</$repere>");
 }
 else {
  return("<$repere style=\"$Style\">$contenu</$repere>");
 }
}

Explication:

L'exemple étend la technique des sous-programmes pour la création de code HTML. Il y a en tout trois sous-programmes: entete_HTML et pied_HTML composent à l'aide de l'Autre page d'information opérateur pour concaténer des chaînes de caractères du code HTML dans une scalaire. À la fin cette fonction est retournée avec la fonction return.

Le sous-programme code_HTML est un peu plus complexe. Il attend trois vers le haut paramètres, à savoir un pour l'élément HTML à créer, un pour son contenu, et un pour des propriétés CSS éventuelles pour le formatage de l'élément. En fonction de ce que le troisième élément a un contenu ou non, (l'embranchement correspondant est fixé avec Autre page d'information if/else ), le code HTML correspondant est composé et la construction HTML est renvoyée avec return.

Dans le programme principal, figurent seulement quelques instructions print. La fonction print est tellement performante qu'elle permet également l'appel d'autres fonctions ou d'autres sous-programmes comme paramètres transmis pour ce qu'elle doit sortir. C'est exactement ce dont on se sert dans l'exemple. La sortie sera celle de la valeur retournée par les sous-programmes respectivement appelés. De la même façon, vous pourriez naturellement affecter la valeur renvoyée à une variable ou en faire autre chose.

Attention:

Les sous-programmes peuvent renvoyer trois sortes de variables, à savoir outre les Autre page d'information scalaires également les Autre page d'information listes/Arrays, les Autre page d'information Hashes et les Autre page d'information références. L'instruction appelante doit veiller à ce que la valeur retournée soit sauvegardée dans le bon format de variable. Quand dans un sous-programme nommé rechercher_composantes est noté par exemple:
return(@composantes_trouvees);
alors une instruction appelante pourrait être par exemple:
my @composantes = rechercher_composantes();
Au cas où la variable lors de l'appel n'est pas du même type que la valeur renvoyée, l'évaluation du contexte de Perl se déclenche automatiquement. Si par exemple, vous appelez le même sous-programme avec:
my $resultat = rechercher_composantes();
Alors, cela équivaudrait à: $resultat = @composantes_trouvees. Le résultat consiste dans ce cas à ce que dans $resultat figure le nombre des éléments du tableau renvoyés, parce que Perl donne, pour une liste en contexte scalaire, le nombre des éléments du tableau.

 vers le haut
page suivante Autre page d'information Tokens
page précédente Autre page d'information Expressions régulières
 

© 2001 Stefan Münz / © 2003 Traduction Adresse électronique Serge François, 13405@free.fr
Adresse électronique selfhtml@selfhtml.com.fr