SELFHTML/Aides à la navigation CGI/Perl Fonctions Perl |
Fonctions pour les modules et progiciels (packages) |
|
Généralités sur ces fonctions |
|
Pour mieux comprendre ces fonction, vous devez lire le chapitre sur les modules Perl.
@INC
- la liste des noms de chemin pour les modulesQuand vous incorporez un fichier module (fichiers *.pm
) avec require ou use, Perl recherche le fichier correspondant soit dans le répertoire actuel, soit dans un répertoire qui est sauvegardé dans la liste des noms de chemin de modules. C'est à cela que sert la variable prédéfinie en Perl @INC
. Dans la partie sur les emplacements de sauvegarde des modules et de la liste @INC vous trouverez un script de travail à l'aide duquel vous pouvez sortir le contenu de @INC
, pour trouver les chemins en vigueur sur votre ordinateur.
Outre la liste @INC
il existe par ailleurs également un hash nommé %INC
. Dans ce hash sont sauvegardés tous les modules déjà chargés. Perl empêche de cette façon que des modules soient chargés plusieurs fois et conduisent ainsi à des anomalies dans le déroulement du programme. Vous n'avez donc pas besoin de vous inquiéter de ce genre de problèmes en Perl, problèmes qui doivent être résolus en C par des instructions au pré-processeur telles que #ifndef
et #define
.
Un espace de nommage s'appelle en Perl un Package. Faute de mentionner quoi que ce soit, chaque fichier Perl se trouve dans le package nommé main
. Les variables qui, dans un fichier Perl, sont définies sans autres restrictions que local ou my, les noms de sous-programmes etc... s'appliquent globalement dans ce fichier. À l'aide de la fonction package vous pouvez sous-diviser un fichier Perl en plusieurs packages.
require
ou use
?Les deux fonctions require et use ont des tâches similaires, leur façon d'agir est cependant différente. require
est chargé pour le déroulement d'un script (et cela à l'endroit où figure l'instruction require
), tandis que use
est déjà incorporé avant au moment de la compilation du script. Pour require
vous passez donc simplement pendant l'exécution du script dans un autre script que vous faites compiler et exécuter puis vous revenez ensuite. Pour use
par contre, vous obtenez après la compilation que Perl exécute avant chaque exécution du script, quasiment un grand script dont le code se compose de plusieurs fichiers modules. Cela a des conséquences. Ainsi des erreurs de syntaxe qui sont contenues dans un module incorporé avec use
, sont repérées d'emblée et le script n'est pas du tout exécuté. Pour require
par contre, il peut arriver que le script principal soit sans faute mais que le script incorporé contienne des erreurs de syntaxe. Celles-ci ne sont toutefois repérées que lorsque le script principal est déjà en cours d'exécution. Ce qui peut provoquer des états indéfinis. Il faut privilégier aujourd'hui dans la plupart des cas l'utilisation de use
. Il y a il est vrai aussi des exceptions.
Finalement les faits sont là: les deux fonctions existent aujourd'hui, et leur histoire diffère. require
est plus ancien (était déjà interprété par Perl 4), tandis que use
est proposé depuis la version 5. Dans la version 5, le concept des modules de Perl a été sensiblement élargi et n'a adopté que là, la forme étendue qu'on lui connaît aujourd'hui.
Avec cette fonction, vous déterminez un espace de nommage comme espace de nommage actif en vigueur. L'espace de nommage reste actif aussi longtemps qu'un autre espace de nommage ne devient pas actif avec un nouvel appel de package
, ou jusqu'à ce que la limite naturelle d'un espace de nommage, donc le bloc actuel (par exemple un sous-programme) ou la fin du fichier est atteinte. De cette manière, pouvez travailler de façon modulaire à l'intérieur d'un fichier script.
Attend comme paramètre:
1. le nom d'un espace de nommage ou un nombre à interpréter comme numéro de version.
#!/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>Sortie du test</title>\n"; print "</head><body>\n"; package allemand; use vars qw($capitale $surface); $capitale = "Berlin"; $surface = "356.910 qm"; package francais; use vars qw($capitale $surface); $capitale = "Paris"; $surface = "551.500 qm"; package allemand; print "<p>La capitale est $capitale et la surface du pays s'élève à $surface </p>"; package francais; print "<p>La capitale est $capitale et la surface du pays s'élève à $surface </p>"; print "</body></html>\n"; |
L'exemple appelle quatre fois en tout package
. La première fois, un nouvel espace de nommage nommé allemand
est créé, et la deuxième fois, un nouvel espace de nommage nommé francais
. La troisième fois, c'est à nouveau l'espace de nommage allemand
qui est appelé, et à partir de cette commande, le script ne connaît plus que les variables, sous-programmes etc... qui ont été définis dans le même espace de nommage. Il en va de même pour la quatrième fois, quand l'espace de nommage francais
est à nouveau appelé.
Lors de l'utilisation de use strict
comme dans l'exemple, les variables qui sont déclarées dans les deux premiers blocs package, doivent être déclarée explicitement globales pour être disponibles lors des appels ultérieurs du package. Pour permettre la déclaration de variables globales, le module standard vars
est disponible. Dans l'exemple, vous voyez comment ce module est mis en œuvre. Incorporé à l'intérieur d'un package avec use
, figurent dans la parenthèse derrière qw
tous les noms de variables du package actuel, qui doivent être déclarées comme globales, donc sans être précédées de my
. Perl ne proteste donc pas devant ces déclarations malgré use strict
.
Aussi longtemps qu'un espace de nommage spécial n'est pas activé avec package
, s'applique l'espace de nommage par défaut de Perl qui porte le nom main
.
Avec cette fonction, vous exécutez un autre fichier Perl quelconque. L'autre script est exécuté à l'endroit où figure l'appel de require
.
Attend comme paramètre:
1. le nom du fichier à incorporer, le cas échéant avec nom de chemin (cas normal), ou un nombre interprété comme numéro de version.
#!/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>Sortie du test</title>\n"; print "</head><body>\n"; require "hello_monde.pl"; print "</body></html>\n"; |
print "Hello monde!"; 1; |
L'exemple montre comment vous pouvez incorporer un script CGI "ordinaire" qui écrit sa sortie sur la sortie standard, dans un script CGI de façon à ce que sa sortie soit envoyée au navigateur WWW. Dans le script CGI, un autre fichier Perl est incorporé avec require "hello_monde.pl"
. Ce fichier écrit simplement Hello monde
sur la sortie standard. Étant donné cependant qu'il est incorporé dans un script qui envoie auparavant l'entête HTTP habituel, la sortie arrive au navigateur en tant que contenu HTML.
Vous pouvez incorporer un fichier module avec l'extension .pm
avec require
de la même façon que vous le faites avec use. Dans ce cas, il vous faut mentionner require nom_module
. Perl recherche alors un fichier nommé nom_module.pm
. Même la syntaxe avec ::
est possible tout à fait comme avec use
(comparez à ce sujet la partie sur la syntaxe d'adressage pour l'incorporation de modules).
Les fichiers Perl incorporés doivent à la fin contenir quelque chose comme 1;
. On s'assure ainsi que le module ou la fonction de module a été exécutée correctement.
Quand un fichier incorporé contient des sous programmes, vous pouvez appeler ceux-ci comme s'ils étaient notés dans le script Perl actuel.
Avec cette fonction, vous chargez un module Perl ou certaines fonctions d'un tel module dans votre script et vous pouvez utiliser le code Perl correspondant dans votre script.
Attend comme paramètre:
1. le nom du module (cas normal), ou un nombre qui est interprété comme numéro de version.
2. à n. (facultatif) autres mentions restrictives (voir plus bas).
#!/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>Sortie du test</title>\n"; print "</head><body>\n"; use Syntax; my $sortie = html_syntax("<h1>Voici à quoi ça ressemble</h1>","red"); print "<h1>Voici à quoi ça ressemble</h1>\n"; print "$sortie\n"; print "</body></html>\n"; |
package Syntax; use strict; use vars qw($VERSION @ISA @EXPORT); require Exporter; @ISA = qw(Exporter); @EXPORT = qw(html_syntax); $VERSION = 1.0; sub html_syntax { my $htmlstr = shift; my $color = shift; $htmlstr =~ s/\&/&/g; $htmlstr =~ s/\"/"/g; $htmlstr =~ s/\</</g; $htmlstr =~ s/\>/>/g; $htmlstr =~ s/(<)/<span style=\"color:$color\">$1/g; $htmlstr =~ s/(>)/$1<\/span>/g; return($htmlstr); } 1; |
L'exemple complet montre un script CGI dans lequel un module défini soi-même est employé, ainsi que le code du fichier module correspondant. Dans le script CGI, le fichier module qui dans l'exemple s'appelle Syntax.pm
et qui se trouve dans le même répertoire que le script CGI ou dans le répertoire principal de @INC
, est incorporé avec use Syntax;
(comparez à ce sujet la partie sur la syntaxe d'adressage pour l'incorporation de modules).).
Le programme principal appelle ensuite un sous-programme nommé html_syntax()
et lui transmet deux paramètres, à savoir une chaîne de caractères avec du code HTML et le nom d'une couleur (red
). Le sous-programme html_syntax()
a pour tâche de masquer le code HTML transmis conformément à HTML et de marquer les repères HTML dans la couleur mentionnée (donc pratiquement de représenter le code HTML transmis avec une mise en valeur de couleur de la syntaxe HTML). Le sous-programme génère ici du nouveau code HTML et renvoie celui-ci à la fin. Dans le programme principal, le code renvoyé est capturé dans la variable $sortie
. Celle-ci à la fin est sortie dans le navigateur.
Le sous-programme html_syntax()
est défini dans le module Syntax
avec sub html_syntax
. Le fichier module contient au début quelques autres instructions qui ne seront pas approfondies ici. Lisez à ce sujet la partie sur l' utilisation étendue de use (@EXPORT, @EXPORT_OK et qw).
|
L'instruction:
use nom_module;
signifie la même chose que:
BEGIN { require nom_module; import nom_module [liste_importation]; }
La fonction use
accomplit donc la somme de ce que fait la fonction require en relation avec la méthode import
.
Quand vous transmettez exactement un argument à use
et que cet argument est un nombre, donc par exemple. 5
ou bien 5.003
, alors Perl vérifie cette mention par rapport au numéro de version de l'interpréteur Perl. Si le numéro de version de l'interpréteur Perl est plus petit que le nombre mentionné, le script en cours est aussitôt arrêté avec un message d'erreur. Ce qui peut être judicieux pour empêcher qu'un script ne se poursuive alors qu'il contient du code nécessitant une version Perl plus élevée.
Les modules incorporés doivent à la fin contenir quelque chose comme 1;
. On s'assure ainsi que le module a été incorporé correctement.
Introduction pour travailler avec des modules | |
Fonctions pour les informations tirées des fichiers de configuration | |
SELFHTML/Aides à la navigation CGI/Perl Fonctions Perl |
© 2001 Stefan Münz / © 2003 Traduction Serge François, 13405@free.fr
selfhtml@fr.selfhtml.org