SELFHTML

Fonctions pour les modules et progiciels (packages)

Page d'information: vue d'ensemble

vers le bas Généralités sur ces fonctions
vers le bas package - Activer l'espace de nommage d'un progiciel (package)
vers le bas require - exécuter un autre fichier Perl
vers le bas use - incorporer un module

 vers le bas 

Généralités sur ces fonctions

Pour mieux comprendre ces fonction, vous devez lire le chapitre sur les Chapitre: vue d'ensemble modules Perl.

@INC - la liste des noms de chemin pour les modules

Quand vous incorporez un fichier module (fichiers *.pm) avec vers le bas require ou vers le bas 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 Autre page d'information variable prédéfinie en Perl @INC. Dans la partie sur les Autre page d'information  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.

Espaces de nommage

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 Autre page d'information local ou Autre page d'information my, les noms de sous-programmes etc... s'appliquent globalement dans ce fichier. À l'aide de la fonction vers le bas package vous pouvez sous-diviser un fichier Perl en plusieurs packages.

Qu'est-ce qui est préférable - require ou use?

Les deux fonctions vers le bas require et vers le bas 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.

 vers le hautvers le bas 

package - Activer l'espace de nommage d'un progiciel (package)

Avec cette fonction, vous déterminez un vers le haut 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.

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>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";

Explication:

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 Autre page d'information 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.

Attention

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.

 vers le hautvers le bas 

require - exécuter un autre fichier Perl

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.

Exemple - partie 1 (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>Sortie du test</title>\n";
print "</head><body>\n";

require "hello_monde.pl";

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

Exemple - partie 2 (fichier module hello_monde.pl):

print "Hello monde!";
1;

Explication:

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.

Attention

Vous pouvez incorporer un fichier module avec l'extension .pm avec require de la même façon que vous le faites avec vers le bas 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 Autre page d'information 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.

 vers le hautvers le bas 

use - - incorporer un module

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

Exemple - partie 1 (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>Sortie du test</title>\n";
print "</head><body>\n";

use Syntax;
my $sortie = html_syntax("<h1>Voici à quoi &ccedil;a ressemble</h1>","red");
print "<h1>Voici à quoi &ccedil;a ressemble</h1>\n";
print "$sortie\n";

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

Exemple - partie 2 (fichier module Syntax.pm):

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/\&/&amp;/g;
  $htmlstr =~ s/\"/&quot;/g;
  $htmlstr =~ s/\</&lt;/g;
  $htmlstr =~ s/\>/&gt;/g;
  $htmlstr =~ s/(&lt;)/<span style=\"color:$color\">$1/g;
  $htmlstr =~ s/(&gt;)/$1<\/span>/g;
  return($htmlstr);
}
1;

Explication:

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 Autre page d'information 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'Autre page d'information utilisation étendue de use (@EXPORT, @EXPORT_OK et qw).

Le tableau suivant expose quelles variantes existent pour incorporer avec use un incorporer un module ou certaines parties de celui-ci:

Exemple: Explication:
use exemple; incorpore un module nommé exemple.pm en impliquant que ce fichier soit sauvegardé soit dans le répertoire de travail actuel, soit dans l'un des répertoires qui sont sauvegardés dans vers le haut @INC. Mentionnez donc le nom de fichier sans son extension. L'extension d'un fichier module doit être .pm.
use exemple::special; incorpore un module nommé special.pm. Ici Perl résout la syntaxe :: comme nom de chemin - c'est à dire qu'un fichier avec le nom de chemin exemple/special.pm est attendu. Ce qui est un nom de chemin relatif par rapport à l'un des chemins de répertoires sauvegardés dans vers le haut @INC.
use CGI::Carp qw(fatalsToBrowser); incorpore le module Carp.pm situé dans le répertoire CGI. Le symbole fatalsToBrowser est transmis à la liste d'importation. Normalement il est alors importé dans l'espace de nommage actuel, ce qui à vrai dire - c'est typique pour Perl - n'est justement pas le cas dans cet exemple populaire. La transmission de fatalsToBrowser déclenche ici un traitement particulier.
use 5.003; Le script ne se poursuit que si un interpréteur Perl est installé dont le numéro de version est égal ou supérieur à 5.003.

Attention

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 vers le haut 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.

 vers le haut
page suivante Autre page d'information Introduction pour travailler avec des modules
page précédente Autre page d'information Fonctions pour les informations tirées des fichiers de configuration
 

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