.\" 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.