.\" Automatically generated by Pod::Man 2.09 (Pod::Simple 3.04) .\" .\" Standard preamble: .\" ======================================================================== .de Sh \" Subsection heading .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. | will give a .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to .\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C' .\" expand to `' in nroff, nothing in troff, for use with C<>. .tr \(*W-|\(bv\*(Tr .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .\" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .hy 0 .if n .na .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "PERLSTYLE 1" .TH PERLSTYLE 1 "2006-03-08" "DocFr" "User Contributed Perl Documentation" .SH "NAME/NOM" .IX Header "NAME/NOM" perlstyle \- Comment (bien) e\*'crire du Perl .SH "DESCRIPTION" .IX Header "DESCRIPTION" Chaque programmeur aura, bien entendu, ses propres pre\*'fe\*'rences dans la manie\*`re d'e\*'crire, mais voici quelques re\*`gles ge\*'ne\*'rales qui rendront vos programmes plus faciles a\*` lire, a\*` comprendre et a\*` mettre a\*` jour. .PP La chose la plus importante est de toujours lancer vos programmes avec le parame\*`tre \fB\-w\fR. Si vous en avez vraiment besoin, vous avez la possibilite\*' de l'enlever explicitement pour des portions de vos programmes a\*` l'aide du pragma \&\f(CW\*(C`no warnings\*(C'\fR ou de la variable \f(CW$^W\fR. Vous devriez aussi toujours utiliser \&\f(CW\*(C`use strict\*(C'\fR ou au moins savoir pourquoi vous ne le faites pas. Les pragmas \&\f(CW\*(C`use sigtrap\*(C'\fR et me\*^me \f(CW\*(C`use diagnostics\*(C'\fR pourront s'ave\*'rer utiles. .PP Pour ce qui est de l'esthe\*'tique du code, la seule chose a\*` laquelle Larry tienne vraiment, c'est que les accolades fermantes d'un \s-1BLOC\s0 multiligne soient aligne\*'es avec le mot\-cle\*' qui marque le de\*'but du bloc. Apre\*`s c\*,a, il a d'autres conseils qui ne sont pas aussi forts\ : .IP "\(bu" 4 Indentation de 4 colonnes. .IP "\(bu" 4 Les accolades ouvrantes sont sur la me\*^me ligne que le mot\-cle\*', si possible, sinon, qu'elles soient aligne\*'es avec lui. .IP "\(bu" 4 Un espace avant l'accolade ouvrante d'un \s-1BLOC\s0 multiligne. .IP "\(bu" 4 Un \s-1BLOC\s0 d'une ligne peut e\*^tre mis sur la me\*^me ligne que le mot\-cle\*', y compris les accolades. .IP "\(bu" 4 Pas d'espace avant le point\-virgule. .IP "\(bu" 4 Point-virgule omis dans les \s-1BLOCS\s0 d'une seule ligne. .IP "\(bu" 4 Des espaces autour des ope\*'rateurs. .IP "\(bu" 4 Des espaces autour d'un indice X\ complexe\ X (entre crochets). .IP "\(bu" 4 Des lignes vides entre les parties qui font des choses diffe\*'rentes. .IP "\(bu" 4 Des else bien visibles. .IP "\(bu" 4 Pas d'espace entre le nom de fonction et la parenthe\*`se ouvrante. .IP "\(bu" 4 Un espace apre\*`s chaque virgule. .IP "\(bu" 4 Couper les lignes trop longues apre\*`s un ope\*'rateur (sauf \f(CW\*(C`and\*(C'\fR et \&\f(CW\*(C`or\*(C'\fR). .IP "\(bu" 4 Un espace apre\*`s la dernie\*`re parenthe\*`se fermante sur la ligne courante. .IP "\(bu" 4 Aligner les items correspondants verticalement. .IP "\(bu" 4 Omettre la ponctuation redondante tant que la lisibilite\*' n'en est pas affecte\*'e. .PP Larry a ses propres raisons pour chacune de ces choses, mais il sait bien que tout le monde ne pense pas comme lui. .PP Voici quelques autres choses plus concre\*`tes auxquelles il faut penser\ : .IP "\(bu" 4 Ce n'est pas parce que vous \fI\s-1POUVEZ\s0\fR faire quelque chose d'une fac\*,on particulie\*`re que vous \fI\s-1DEVEZ\s0\fR le faire de cette manie\*`re. Perl a e\*'te\*' conc\*,u pour vous offrir plusieurs possibilite\*'s de faire une chose pre\*'cise, alors, pensez a\*` prendre la plus compre\*'hensible. Par exemple\ : .Sp .Vb 1 \& open(FOO,$foo) || die "J'arrive pas a\*` ouvrir $foo: $!"; .Ve .Sp est mieux que\ : .Sp .Vb 1 \& die "J'arrive pas a ouvrir $foo: $!" unless open(FOO,$foo); .Ve .Sp et ce, parce que la deuxie\*`me me\*'thode ne met pas en avant l'instruction inte\*'ressante. D'un autre co\*^te\*'\ : .Sp .Vb 1 \& print "De\*'but de l'analyse\en" if $verbose; .Ve .Sp est mieux que\ : .Sp .Vb 1 \& $verbose && print "De\*'but de l'analyse\en"; .Ve .Sp car l'inte\*'re\*^t n'est pas de savoir si l'utilisateur a tape\*' \fB\-v\fR ou non. .Sp D'une manie\*`re similaire, ce n'est pas parce qu'un ope\*'rateur suppose des arguments par de\*'faut qu'il faut que vous utilisiez ces arguments. Les re\*'glages par de\*'faut sont faits pour les programmeurs syste\*`mes paresseux qui e\*'crivent un programme pour une seule utilisation. Si vous voulez que votre programme soit lisible, mettez les arguments. .Sp Dans le me\*^me ordre d'ide\*'e, ce n'est pas parce que les parenthe\*`ses \fIpeuvent\fR e\*^tre omises qu'il ne faut pas en mettre\ : .Sp .Vb 2 \& return print reverse sort num values %array; \& return print(reverse(sort num (values(%array)))); .Ve .Sp Quand vous avez un doute, mettez des parenthe\*`ses. Au moins, c\*,a permettra aux pauvres gars de s'en remettre a\*` la touche % sous \fBvi\fR. .Sp Me\*^me si vous e\*^tes su\*^r de vous, pensez a\*` la sante\*' mentale de la personne qui aura a\*` mettre a\*` jour le code apre\*`s vous et qui mettra tre\*`s certainement les parenthe\*`ses au mauvais endroit. .IP "\(bu" 4 Ne faites pas de contorsions impossibles pour re\*'ussir a\*` sortir d'une boucle, Perl fournit l'ope\*'rateur \f(CW\*(C`last\*(C'\fR qui vous permet de sortir. Faites le juste de\*'passer pour le rendre plus visible (X\ outdent\ X en anglais). .Sp .Vb 7 \& LINE: \& for (;;) { \& instructions; \& last LINE if $truc; \& next LINE if /^#/; \& instructions; \& } .Ve .IP "\(bu" 4 N'ayez pas peur d'utiliser des labels de boucle. Ils sont la\*` pour rendre le code plus lisible autant que pour permettre de sauter plusieurs niveaux de boucles. Re\*'fe\*'rez\-vous a\*` l'exemple pre\*'ce\*'dent. .IP "\(bu" 4 E\*'vitez d'utiliser \f(CW\*(C`grep()\*(C'\fR (ou \f(CW\*(C`map()\*(C'\fR) ou des X\ backticks\ X (`) dans un contexte vide, c'est\-a\*`\-dire, quand vous ne re\*'cupe\*'rez pas les valeurs qu'elles retournent. Ces fonctions retournent toujours des valeurs alors, utilisez\-les. Sinon, a\*` la place, utilisez une boucle \f(CW\*(C`foreach()\*(C'\fR ou la fonction \&\f(CW\*(C`system()\*(C'\fR. .IP "\(bu" 4 Pour conserver la portabilite\*', quand vous utilisez des fonctionnalite\*'s qui ne seront peut\-e\*^tre pas imple\*'mente\*'es sur toutes les machines, testez les instructions dans un eval pour voir si elles e\*'chouent. Si vous savez a\*` partir de quelle version et quel niveau de patch la fonctionnalite\*' a e\*'te\*' imple\*'mente\*'e, vous pouvez tester \f(CW$]\fR (\f(CW$PERL_VERSION\fR en \f(CW\*(C`Anglais\*(C'\fR) pour voir si elle est pre\*'sente. Le module \f(CW\*(C`Config\*(C'\fR vous permettra aussi de savoir quelles options ont e\*'te\*' retenues par le programme \fBConfigure\fR quand Perl a e\*'te\*' installe\*'. .IP "\(bu" 4 Choisissez des identificateurs ayant un sens mne\*'monique. Si vous n'arrivez pas a\*` vous rappeler a\*` quoi ils correspondent, vous avez un proble\*`me. .IP "\(bu" 4 Bien que les petits identificateurs comme \f(CW$nbmots\fR sont compre\*'hensibles, les identificateurs longs sont plus lisibles si les mots sont se\*'pare\*'s par des underscores. Il est plus facile de lire \&\f(CW$un_nom_de_variable\fR que \f(CW$UnNomDeVariable\fR, surtout pour ceux qui ne parlent pas tre\*`s bien la langue dans laquelle le programme a e\*'te\*' e\*'crit. C'est aussi une re\*`gle simple qui marche aussi avec \&\f(CW\*(C`UN_NOM_DE_CONSTANTE\*(C'\fR. .Sp Les noms de paquetages font parfois exception a\*` la re\*`gle. Perl re\*'serve de fac\*,on informelle des noms de modules en minuscules pour des modules X\ pragma\ X tels \f(CW\*(C`integer\*(C'\fR ou \f(CW\*(C`strict\*(C'\fR. Les autres modules devraient commencer avec une majuscule et utiliser une casse varie\*'e, mais ne mettez pas d'underscores a\*` cause des limitations dans les noms des modules sur certains syste\*`mes de fichiers primitifs qui ne permettent que quelques caracte\*`res. .IP "\(bu" 4 Vous pouvez trouver utile de laisser la casse indiquer la visibilite\*' ou la nature d'une variable. Par exemple\ : .Sp .Vb 5 \& $TOUT_EN_MAJUSCULES les constantes uniquement (attention \& aux collisions avec les variables internes \& de Perl !) \& $Quelques_majuscules variables globales/statiques \& $pas_de_majuscule internes a\*` une fonction (my () ou local()) .Ve .Sp Les noms de fonctions et de me\*'thodes semblent mieux marcher quand elles sont en minuscule. Ex\ : \f(CW\*(C`$obj\->as_string()\*(C'\fR. .Sp Vous pouvez utiliser un underscore au de\*'but de la variable pour indiquer qu'elle ne doit pas e\*^tre utilise\*'e hors du paquetage qui la de\*'finit. .IP "\(bu" 4 Si vous avez une expression re\*'gulie\*`re de la mort, utilisez le modificateur \&\f(CW\*(C`/x\*(C'\fR et ajoutez un peu d'espaces pour que cela ressemble un peu plus a\*` quelque chose. N'utilisez pas de slash comme de\*'limiteurs quand votre regexp contient des slash ou des antislash. .IP "\(bu" 4 Utilisez les nouveaux ope\*'rateurs \f(CW\*(C`and\*(C'\fR et \f(CW\*(C`or\*(C'\fR pour e\*'viter d'avoir a\*` mettre trop de parenthe\*`ses dans les listes d'ope\*'rations et pour re\*'duire l'utilisation des ope\*'rateurs tels \f(CW\*(C`&&\*(C'\fR et \f(CW\*(C`||\*(C'\fR. Appelez vos routines comme s'il s'agissait de fonctions ou d'ope\*'rateurs de listes pour e\*'viter le surplus de parenthe\*`ses et de X\ &\ X. .IP "\(bu" 4 Utilisez des \f(CW\*(C`here\*(C'\fR (ope\*'rateur \f(CW\*(C`<<\*(C'\fR) pluto\*^t que des instructions \&\f(CW\*(C`print()\*(C'\fR re\*'pe\*'te\*'s. .IP "\(bu" 4 Alignez ce qui correspond verticalement, spe\*'cialement si c'est trop long pour tenir sur une seule ligne. .Sp .Vb 4 \& $IDX = $ST_MTIME; \& $IDX = $ST_ATIME if $opt_u; \& $IDX = $ST_CTIME if $opt_c; \& $IDX = $ST_SIZE if $opt_s; \& \& mkdir $tmpdir, 0700 or die "je peux pas faire mkdir $tmpdir: $!"; \& chdir($tmpdir) or die "je peux pas faire chdir $tmpdir: $!"; \& mkdir 'tmp', 0777 or die "je peux pas faire mkdir $tmpdir/tmp: $!"; .Ve .IP "\(bu" 4 Ve\*'rifiez toujours la valeur retourne\*'e par un appel syste\*`me. Les meilleurs messages d'erreur sont ceux qui sont dirige\*'s sur \f(CW\*(C`STDERR\*(C'\fR et qui fournissent\ : le programme en cause, l'appel syste\*`me qui a e\*'choue\*' avec ses arguments et (TRE\*`S \s-1IMPORTANT\s0) le message d'erreur syste\*`me indiquant la cause de l'e\*'chec. Voici un exemple simple, mais suffisant\ : .Sp .Vb 1 \& opendir(D, $dir) or die "je peux pas faire opendir $dir: $!"; .Ve .IP "\(bu" 4 Alignez vos translite\*'rations quand cela a un sens\ : .Sp .Vb 2 \& tr [abc] \& [xyz]; .Ve .IP "\(bu" 4 Pensez a\*` la re\*'utilisation du code. Pourquoi perdre de l'e\*'nergie en produisant un code jetable alors que vous aurez certainement a\*` refaire quelque chose de similaire dans quelque temps\ ? Pensez a\*` ge\*'ne\*'raliser votre code. Pensez a\*` e\*'crire un module ou une classe. Pensez a\*` faire tourner votre code proprement avec \f(CW\*(C`use strict\*(C'\fR et \f(CW\*(C`use warnings\*(C'\fR (ou \fB\-w\fR) active\*'s. Pensez a\*` distribuer votre code. Pensez a\*` changer votre regard sur le monde. Pensez a\*`... oh, non, oubliez. .IP "\(bu" 4 Pensez a\*` documenter votre code en utilisant le formatage Pod de manie\*`re cohe\*'rente. Voici quelques conventions courantes\ : .RS 4 .IP "\(bu" 4 Utilisez \f(CW\*(C`C<>\*(C'\fR pour les noms de fonctions, de variables et de modules (et plus ge\*'ne\*'ralement pour tout ce qui peut e\*^tre conside\*'re\*' comme du code tel que les filehandles ou des valeurs spe\*'cifiques). Remarquez qu'un nom de fonction est conside\*'re\*' comme plus lisible si il est suivi de parenthe\*`ses comme pour \f(CW\*(C`fonction()\*(C'\fR. .IP "\(bu" 4 Utilisez \f(CW\*(C`B<>\*(C'\fR pour les commandes comme \fBcat\fR ou \fBgrep\fR. .IP "\(bu" 4 Utilisez \f(CW\*(C`F<>\*(C'\fR ou \f(CW\*(C`C<>\*(C'\fR pour les noms de fichiers. \&\f(CW\*(C`F<>\*(C'\fR devrait e\*^tre utilise\*' syste\*'matiquement pour les noms de fichiers mais comme de nombreux traducteurs Pod le traduisent par de l'italique, les chemins Unix et Windows avec des \f(CW\*(C`/\*(C'\fR et des \f(CW\*(C`\e\*(C'\fR peuvent e\*^tre moins lisibles et plus pre\*'sentables par un \&\f(CW\*(C`C<>\*(C'\fR. .RE .RS 4 .RE .IP "\(bu" 4 Soyez cohe\*'rents. .IP "\(bu" 4 Soyez gentils. .SH "TRADUCTION" .IX Header "TRADUCTION" .Sh "Version" .IX Subsection "Version" Cette traduction franc\*,aise correspond a\*` la version anglaise distribue\*'e avec perl 5.8.8. Pour en savoir plus concernant ces traductions, consultez . .Sh "Traducteur" .IX Subsection "Traducteur" Traduction initiale\ : Matthieu Arnold .PP Mise a\*` jour\ : Paul Gaborit .Sh "Relecture" .IX Subsection "Relecture" Ge\*'rard Delafond.