perlmodlib - Pour construire de nouveaux modules et trouver les existants
Un certain nombre de modules sont inclus dans la distribution de Perl. Ils sont décrit plus loin, à la fin du .pm. Vous pouvez alors découvrir les fichiers dans le répertoire des librairies qui se terminent par autre chose que .pl ou .ph. Ce sont d'anciennes librairies fournies pour que les anciens programmes les utilisant continuent de fonctionner. Les fichiers .pl ont tous été converti en modules standards, et les fichiers .ph fabriqués par h2ph sont probablement terminé comme extension des modules fabriqués par h2xs. (Certains .ph peuvent être déjà disponible par le module POSIX. Le fichier pl2pm de la distribution peut vous aider dans votre conversion, mais il s'agit que d'un mécanisme du processus et par conséquent loin d'être une preuve infaillible.
Ils fonctionnent comme les pragmas par le fait qu'ils ont tendance à
affecter la compilation de votre programme, et ainsi fonctionne
habituellement bien que lorsqu'ils sont utilisés avec use
, ou no
.
La plupart de ceux-ci ont une portée locale, donc un BLOCK interne
peut outrepasser n'importe lequel en faisant:
no integer; no strict 'refs';
ce qui dure jusqu'à la fin de ce BLOC.
À la différence des pragmas qui effectuent $^H
variable de
conseils, les déclarations use vars
et use subs
ne sont pas
limitées au bloc. Elles vous permettent de prédéclarer des variables ou
des sous-programmes dans un fichier plutôt que juste pour un bloc.
De telles déclarations sont pertinentes pour le fichier entier dans
lequel elles ont été déclarées. Vous ne pouvez pas les annuler avec
no vars
ou no subs
.
Les pragmas suivants sont définis (et ont leur propre documentation).
require MODULE
jusqu'à ce que quelqu'un appelle un des
sous-programmes indiqués (qui doivent être exportés par MODULE). Ce
pragma devrait être utilisé avec prudence, et seulement si nécessaire.
En standard, on s'attend à ce que des modules empaquetés se comportent tous d'une façon bien définie en ce qui concerne la pollution de namespace parce qu'ils utilisent le module Exporter. Voir leur propre documentation pour des détails.
stat()
functions
=item IO::File
fournit les méthodes d'objets pour les descripteurs de fichiers
cherche une clef dans le fichier du dictionnaire
manipule les symboles Perl et leurs noms
syslog(3)
readline
variés
expand(1)
et
unexpand(1)
gmtime()
localtime()
Pour trouver tous les modules installés sur votre système, incluant ceux sans documentation ou en dehors de la release standard, faites ceci:
% find `perl -e 'print "@INC"'` -name '*.pm' -print
Ils doivent avoir leur propre documentation installée et accessible via votre commande système man(1). Si cela échoue, essayer le programme perldoc.
Les extensions de modules sont écrits en C (ou un mixte de Perl et de C) et peuvent être liées (linked) statiquement ou en général sont chargées dynamiquement dans Perl si et quand vous en avez besoin. Les extensions de modules supportées comprennent les Socket, Fcntl, et les modules POSIX.
La plupart des extensions C de modules populaires n'arrivent pas tout prêt (ou du moins, pas complètement) due à leur taille, leur volatibilitée, ou simplement par manque de temps de tests adéquats et de configuration autour des multitudes de plates-formes où Perl est beta-testé. Vous êtes encouragé à les regarder dans archie(1L), la FAQ Perl ou Meta-FAQ, les pages WWW, et même avec leur auteurs avant de poster des questions pour leurs conditions et dispositions actuelles.
CPAN signifie le Comprehensive Perl Archive Network. Il s'agit d'une réplique globale de tous les matériaux Perl connus, incluant des centaines de modules non chargés. Voici les catégories principales de ces modules:
Les sites officiels CPAN en date de cette écriture sont les suivants. Vous devriez essayer de choisir un près de chez vous:
Afrique du Sud ftp://ftp.is.co.za/programming/perl/CPAN/
Hong Kong ftp://ftp.hkstar.com/pub/CPAN/ Japon ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/ ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/ Corée du Sud ftp://ftp.nuri.net/pub/CPAN/ Taiwan ftp://dongpo.math.ncu.edu.tw/perl/CPAN/ ftp://ftp.wownet.net/pub2/PERL/
Australie ftp://ftp.netinfo.com.au/pub/perl/CPAN/ Nouvelle Zélande ftp://ftp.tekotago.ac.nz/pub/perl/CPAN/
Autriche ftp://ftp.tuwien.ac.at/pub/languages/perl/CPAN/ Belgique ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/ Rép. Tchèque ftp://sunsite.mff.cuni.cz/Languages/Perl/CPAN/ Danemark ftp://sunsite.auc.dk/pub/languages/perl/CPAN/ Finlande ftp://ftp.funet.fi/pub/languages/perl/CPAN/ France ftp://ftp.ibp.fr/pub/perl/CPAN/ ftp://ftp.pasteur.fr/pub/computing/unix/perl/CPAN/ Allemagne ftp://ftp.gmd.de/packages/CPAN/ ftp://ftp.leo.org/pub/comp/programming/languages/perl/CPAN/ ftp://ftp.mpi-sb.mpg.de/pub/perl/CPAN/ ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/ ftp://ftp.uni-erlangen.de/pub/source/Perl/CPAN/ ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/ Grèce ftp://ftp.ntua.gr/pub/lang/perl/ Hongrie ftp://ftp.kfki.hu/pub/packages/perl/CPAN/ Italie ftp://cis.utovrm.it/CPAN/ the Netherlands ftp://ftp.cs.ruu.nl/pub/PERL/CPAN/ ftp://ftp.EU.net/packages/cpan/ Norvège ftp://ftp.uit.no/pub/languages/perl/cpan/ Pologne ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/ ftp://sunsite.icm.edu.pl/pub/CPAN/ Portugal ftp://ftp.ci.uminho.pt/pub/lang/perl/ ftp://ftp.telepac.pt/pub/CPAN/ Russie ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/ Slovénie ftp://ftp.arnes.si/software/perl/CPAN/ Espagne ftp://ftp.etse.urv.es/pub/mirror/perl/ ftp://ftp.rediris.es/mirror/CPAN/ Suède ftp://ftp.sunet.se/pub/lang/perl/CPAN/ RU ftp://ftp.demon.co.uk/pub/mirrors/perl/CPAN/ ftp://sunsite.doc.ic.ac.uk/packages/CPAN/ ftp://unix.hensa.ac.uk/mirrors/perl-CPAN/
Ontario ftp://ftp.utilis.com/public/CPAN/ ftp://enterprise.ic.gc.ca/pub/perl/CPAN/ Manitoba ftp://theory.uwinnipeg.ca/pub/CPAN/ Californie ftp://ftp.digital.com/pub/plan/perl/CPAN/ ftp://ftp.cdrom.com/pub/perl/CPAN/ Colorado ftp://ftp.cs.colorado.edu/pub/perl/CPAN/ Floride ftp://ftp.cis.ufl.edu/pub/perl/CPAN/ Illinois ftp://uiarchive.uiuc.edu/pub/lang/perl/CPAN/ Massachusetts ftp://ftp.iguide.com/pub/mirrors/packages/perl/CPAN/ New York ftp://ftp.rge.com/pub/languages/perl/ Caroline du Nord ftp://ftp.duke.edu/pub/perl/ Oklahoma ftp://ftp.ou.edu/mirrors/CPAN/ Oregon http://www.perl.org/CPAN/ ftp://ftp.orst.edu/pub/packages/CPAN/ Pennsylvanie ftp://ftp.epix.net/pub/languages/perl/ Texas ftp://ftp.sedl.org/pub/mirrors/CPAN/ ftp://ftp.metronet.com/pub/perl/
Chili ftp://sunsite.dcc.uchile.cl/pub/Lang/perl/CPAN/
Pour une liste à jour des sites CPAN, voir http://www.perl.com/perl/CPAN ou ftp://ftp.perl.com/perl/.
(la section suivante est empruntée directement des fichiers des modules de Tim Buncees, disponible depuis votre site CPAN plus proche.)
Le Perl implémente une classe en utilisant un module, mais la présence d'un module n'implique pas la présence d'une classe. Un module est juste un espace de nom (namespace). Une classe est un module qui fournit les sous-programmes qui peuvent être utilisés comme méthodes. Une méthode est juste un sous-programme qui prévoit que son premier argument est le nom d'un module (pour des méthodes ``statiques''), ou une référence à quelque chose (pour des méthodes ``virtuelles'').
Un module est un fichier qui (par convention) fournit une classe du même nom (sans le .pm), plus une méthode d'importation dans cette classe qui peut s'appeler pour chercher les symboles exportés. Ce module peut appliquer certaines de ses méthodes en chargeant les objets dynamiques en C ou en C++, mais cela devrait être totalement transparent à l'utilisateur du module. De même, le module pourrait installer une fonction AUTOLOAD dans des définitions de sous-programme à la demande, mais c'est également transparent. Seulement un fichier .pm est nécessaire pour exister. Voir la page de manuel perlsub, la page de manuel perltoot, et AutoLoader pour des détails au sujet du mécanisme de AUTOLOAD.
Si vous écrivez un module pour étendre un ensemble de modules déjà existant, coordonnez-vous s'il vous plaît avec l'auteur du module. Cela aide si vous suivez la même convention de nom et d'interaction de module que l'auteur initial.
sub new { my $class = shift; return bless {}, $class; }
ou même ceci si vous voudriez qu'il soit utilisé comme méthode statique ou virtuelle :
sub new { my $self = shift; my $class = ref($self) || $self; return bless {}, $class; }
Un passage de tableau comme références permet ainsi plus de paramètres pouvant être ajoutés plus tard (et également plus rapide). Convertissez les fonctions en méthodes le cas échéant. Coupez les grandes méthodes en les plus petites plus flexibles. Héritez des méthodes d'autres modules si approprié.
Evitez les essais nommés de classe comme: die "Invalid" unless ref
$ref eq 'FOO'
. D'une façon générale vous pouvez effacer la partie
``eq 'FOO'
'' sans que cela pose problème. Laissez les objets s'occuper
d'eux! D'une façon générale, évitez les noms codés en dur de classe
aussi loin que possible.
Evitez $r->Class::func()
en utilisant @ISA=qw(... Class ...)
et $r->func()
fonctionnera (voir la page de manuel perlbot pour plus de
détails).
Utilisez autosplit pour les fonctions peu utilisées ou nouvellement ajoutées pour que cela ne soit pas un fardeau pour les programmes qui ne les utilisent pas. Ajoutez les fonctions de test au module après le __END__ en utilisant AutoSplit ou en disant:
eval join('',<main::DATA>) || die $@ unless caller();
Votre module passe-t-il le test 'de la sous classe vide? Si vous dites
`` @SUBCLASS::ISA = qw(YOURCLASS);
'' vos applications devraient
pouvoir utiliser la SOUS-CLASSE exactement de la même façon que
YOURCLASS. Par exemple, est-ce que votre application fonctionne
toujours si vous changez: $obj = new VOTRECLASSE;
en: $obj = new
SOUS-CLASSE;
Evitez de maintenir n'importe quelle information d'état dans vos modules. Cela le rend difficile d'utilisation pour de multiple autres modules. Gardez à l'esprit l'information d'état de subsistance dans les objets.
Essayez toujours d'utiliser -w. Essayez d'utiliser use strict;
(ou use strict qw(...);
). Souvenez-vous que vous pouvez ajouter
no strict qw(...);
aux blocs individuels code qui nécessite moins
de contraintes. Utilisez toujours -w. Utilisez toujours -w!
Suivez les directives de perlstyle(1).
La façon de coder est une question de goût personnel. Beaucoup de gens font évoluer leur style sur plusieurs années pendant qu'elles apprennent ce qui les aide à écrire et mettre à jour un bon code. Voici un ensemble de suggestions assorties qui semblent être largement répandues par les réalisateurs expérimentés:
Employez les underscore pour séparer des mots. Il est généralement plus facile de lire $un_nom_de_variable que $UnNomDeVariable, particulièrement pour les personnes de langue maternelle autre que l'anglais. C'est une règle simple qui fonctionne également avec NOM_DE_VARIABLE.
Les noms de Package/Module sont une exception à cette règle. Le Perl réserve officieusement des noms minuscules de module pour des modules de 'pragma' comme les nombre entier et strict. D'autres modules normalement commencent par une majuscule et utilisent ensuite les cas mélangés sans des souligné (besoin d'être court et portable).
Vous pouvez trouvez pratique d'utiliser la case des lettres pour indiquer la portée ou la nature d'une variable. Par exemple:
$TOUT_EN_MAJUSCULES : seulement les constantes (prenez garde aux désaccords avec les variables de Perl) $Seulement_Quelques_Majuscules portée le temps d'un paquetage, variables globales/statiques $aucune_majuscules portée d'une variable dans une fonction avec my() ou local()
Les noms de fonction et de méthode semblent mieux fonctionner quand
tout est en minuscule. ex., $obj->as_string()
.
Vous pouvez employer un underscore devant le nom des variables pour indiquer qu'une variable ou une fonction ne devrait pas être utilisée en dehors du module qui l'a définie.
N'exportez pas toute autre chose par défaut sans bonne raison!
Les exportations polluent le namespace de l'utilisateur du module. Si vous devez exporter quelque chose utiliser @EXPORT_OK de préférence à @EXPORT et éviter des noms communs ou courts pour réduire le risque de désaccords sur les noms.
D'une façon générale quelque chose non exporté est encore accessible
de l'extérieur du module en utilisant la syntaxe de
ModuleName::item_name (ou $blessed_ref->method
). Par convention
vous pouvez employer un underscore précédent le nom de variable pour
indiquer officieusement qu'il s'agit de variables 'internes' et pas
pour l'usage public.
(il est possible d'obtenir des fonctions privées en disant: my $subref = sub
{ ... }; &$subref;
. Mais il n'y a aucune façon de les appeler directement
comme méthode, parce qu'une méthode doit avoir un nom dans la table de
symbole.)
En règle générale, si le module essaye d'être orienté objet alors n'exportez rien. S'il c'est juste une collection de fonctions alors @EXPORT_OK quelque chose mais l'utilisation de @EXPORT est à faire avec prudence.
Ayant 57 modules tous appelé Sort ne rendra pas la vie facile pour n'importe qui (avoir cependant 23 appelés Sort::Quick est seulement marginalement meilleur :-) . Imaginez quelqu'un essayant d'installer votre module à côté de beaucoup d'autres. Si vous avez un doute demandez des suggestions dans comp.lang.perl.misc.
Si vous développez une suite de modules/classes liés, habituellement on utilise les classes emboîtées avec un préfixe commun car ceci évitera des désaccords de namespace. Par exemple: Xyz::Control, Xyz::View, Xyz::Model etc... Utilisez les modules dans cette liste comme guide nommant.
Si vous ajoutez un nouveau module à un ensemble, suivez les normes de l'auteur initial pour nommer les modules et l'interface des méthodes dans ces modules.
Pour être portable, chaque composant d'un nom de module devrait être limité à 11 caractères. S'il pourrait être employé sur MS-DOS alors vous devez vous assurer que chacun fait moins de 8 caractères. Les modules emboîtés facilitent ceci.
La meilleure façon de savoir est de prendre beaucoup de suggestions utiles, et de demander à quelqu'un qui sait. Comp.lang.perl.misc est lu par toutes les personnes qui développent des modules et c'est le meilleur endroit pour demander.
Tout que vous devez faire est de poster un court sommaire du module, de son but et de ses interfaces. Quelques lignes sur chacune des méthodes principales est probablement suffisant. (si vous signalez le module entier il pourrait être ignoré par les personnes occupées - généralement les mêmes personnes dont vous aimeriez avoir l'avis !)
Ne vous inquiétez dans votre post si vous ne pouvez pas dire quand le module sera prêt - juste dites-le dans le message. Il pourrait être intéressant d'inviter d'autres pour vous aider, ils peuvent le terminer pour vous!
Si le fichier README semble devenir trop large, séparer le en plusieurs sections dans des fichiers séparés: INSTALL, Copying,(A copier) ToDo(A faire) etc.
Perl, par exemple, est fournie avec deux types de licence: GNU GPL et The Artistic Licence (voir les fichiers README, Copying, et Artistic). Larry a de bonnes raisons pour ne pas utiliser que GNU GPL.
Ma recommandation personnelle, en dehors du respect pour Larry, est que Perl, et la communauté Perl au sens large est simplement défini comme tel:
Copyright (c) 1995 Your Name. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Ce texte devrait au moins apparaître dans le fichier README. Vous pouvez également souhaiter l'inclure dans un fichier Copying et dans vos fichiers sources. Rappelez-vous d'inclure les autres mots en plus de copyright.
$VERSION = " 0,01 "
). n'utilisez
pas une version du modèle ``1.3.2''. Voir Exporter.pm dans Perl5.001m ou
plus pour des détails.
Il peut être pratique pour ajouter une fonction ou méthode de rechercher le nombre. Utilisez le nombre dans les annonces et les noms de fichier d'archives quand vous faites une version d'un module (ModuleName-1.02.tar.Z). Voir perldoc ExtUtils::MakeMaker.pm pour des détails.
Si possible vous pouvez placer le module dans un des archives importantes ftp et inclure les détails de son emplacement dans votre annonce.
Quelques notes au sujet des archives ftp: Veuillez utiliser un nom de fichier descriptif qui inclut le numéro de version. La plupart des répertoires entrants ne seront pas lisibles/listables, c.-à-d., vous ne pourrez pas voir votre fichier après l'avoir téléchargé. Rappelez-vous d'envoyer votre message d'avis par mail aussitôt que possible après avoir téléchargé votre module, autrement votre fichier peut obtenir effacé automatiquement. Accordez du temps pour que le fichier soit traité et/ou contrôlez que le fichier a été traité avant d'annoncer son emplacement.
FTP Archives for Perl Modules:
Suivre les instructions et les liens sur
http://franz.ww.tu-berlin.de/modulelist
ou posez le dans un de ces sites:
ftp://franz.ww.tu-berlin.de/incoming ftp://ftp.cis.ufl.edu/incoming
et prévenez <upload@franz.ww.tu-berlin.de>.
En utilisant l'interface WWW vous pouvez demander au serveur de téléchargement de refléter vos modules de votre ftp ou de votre site Web dans votre propre répertoire sur CPAN!
Rappelez-vous s'il vous plaît de m'envoyer une entrée mise à jour pour la liste de modules!
die(...)
en croak(...)
Le processus mécanique de pl2pm n'est pas une preuve garantie. Le code converti aura besoin de contrôles soigneux, particulièrement pour tous les rapports de module. N'effacez pas le fichier initial pl jusqu'à ce que le nouveau pm ne fonctionne!
% perl -e 'use Module::Name; method(@ARGV)' ...
ou
% perl -mModule::Name ... (perl5.002 ou plus récent)
Le Perl n'impose pas de parties privées et publiques de ses modules comme vous avez pu voir dans d'autres langages comme C++, ADA, ou Modula-17. Le Perl n'a pas d'infatuation (satisfaction excessive et ridicule que l'on a de soi N.D.T) avec l'intimité imposée. Il préférerait que vous êtes restiez hors de sa salle à manger parce que vous n'avez pas été invités, pas parce qu'il a un fusil de chasse.
Le module et son utilisateur ont un contrat, dont une partie est un droit commun, et une partie qui est ``écrite''. Une partie du contrat de droit commun est qu'un module ne pollue aucun namespace qu'on ne lui ai pas demandé. Le contrat écrit pour le module (cad la documentation) peut prendre d'autres dispositions. Mais vous savez quand vous utilisez <use RedefineTheWorld>, vous redéfinissez le monde et voulez bien en accepter les conséquences.
Cette traduction française correspond à la version anglaise distribuée avec perl 5.005_02. Pour en savoir plus concernant ces traductions, consultez http://perl.enstimac.fr/.
Yves Maniette <yves@giga.sct.ub.es>
Personne pour l'instant.