.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14
.\"
.\" 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 "PERLFORM 1"
.TH PERLFORM 1 "2005-04-10" "DocFr" "User Contributed Perl Documentation"
.SH "NOM"
.IX Header "NOM"
perlform \- Formats Perl
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
Perl possède un mécanisme qui permet de générer des rapports et
tableaux simples. Pour ce faire, il vous aide à écrire le code
de manière semblable à ce à quoi il ressemblera lors de l'impression.
On peut garder la trace du
nombre de lignes par page, sur quelle page on se trouve, quand
imprimer des entêtes, etc. Les mots\-clés sont empruntés au \s-1FORTRAN\s0 :
\&\fIformat()\fR pour déclarer, \fIwrite()\fR pour exécuter\ ; référez\-vous à leurs
entrées dans perlfunc. Heureusement, le layout est largement plus
lisible, un peu comme l'instruction \s-1PRINT\s0 \s-1USING\s0 du \s-1BASIC\s0. Voyez-le
comme une sorte de «\ \fInroff\fR\|(1) du pauvre\ ».
.PP
Les formats, comme les paquetages et les sous\-programmes, sont
déclarés plutôt qu'exécutés\ : ils peuvent donc apparaître à
n'importe quel point de vos programmes, mais mieux vaut les
regrouper. Ils ont leur propre espace de nommage, bien séparé des
autres «\ types\ » de Perl. Cela signifie que peuvent coexister une
fonction «\ bidule\ » et un format «\ bidule\ ». Cependant, le nom par défaut
d'un format associé à un fichier est le nom du fichier. Par
conséquent, le nom par défaut du format pour \s-1STDOUT\s0 est «\ \s-1STDOUT\s0\ », et
le nom du format par défaut pour le fichier \s-1TEMP\s0 est «\ \s-1TEMP\s0\ ». Ils ont l'air
semblables, mais ne le sont pas.
.PP
Les formats de sortie sont déclarés comme suit\ :
.PP
.Vb 3
\& format NOM =
\& LISTEDEFORMATS
\& .
.Ve
.PP
Si le nom est omis, le format «STDOUT» est alors automatiquement
défini. \s-1LISTEDEFORMATS\s0 consiste en une suite de lignes, chacune d'elle
pouvant être de l'un des trois types suivants\ :
.IP "1." 4
Un commentaire, indiqué par un '#' dans la première colonne.
.IP "2." 4
Une ligne-image donnant le format de la ligne.
.IP "3." 4
Une ligne d'arguments, donnant les valeurs à insérer dans la
ligne-image précédente.
.PP
Les lignes-images s'imprimeront exactement comme elles ont été écrites,
à l'exception des champs remplacés par des arguments dans ces lignes.
Chaque champ d'une ligne-image commence par une arrobe (@) ou
un accent circonflexe (^). Ces lignes ne font l'objet d'aucune
interprétation. Le champ @, à ne pas confondre avec le symbole de
tableau «\ @\ », est le type de champ normal. L'autre type, le champ ^,
sert à faire du remplissage multiligne rudimentaire.
On définit la longueur de
champ en le remplissant avec les caractères «\ <\ », «\ >\ », ou
«\ |\ », pour aligner, respectivement, à gauche, à droite, ou au
centre. Si la variable excède la longueur spécifiée, elle sera tronquée.
.PP
On peut aussi aligner à droite en utilisant le caractère «\ #\ », avec un
«\ .\ » optionnel, pour spécifier un champ numérique\ : l'alignement se
fait sur le «\ .\ » décimal. Si la valeur spécifiée pour ces types de
champs contient un retour à la ligne, seul le texte jusqu'au
retour à la ligne est imprimé.
Enfin, le champ spécial «@*» peut être employé pour
écrire des valeurs multilignes non tronquées\ ; il doit apparaître seul
sur la ligne.
.PP
Les valeurs sont spécifiées sur la ligne suivante, dans le même ordre
que les champs images. Les expressions fournissant les valeurs
doivent être séparées par des virgules. Les expressions sont toutes
évaluées en tant que liste avant que la ligne ne soit traitée. Une
seule expression peut donc créer toute une liste d'éléments. Les
expressions peuvent être écrites sur plusieurs lignes, à condition de
les placer entre parenthèses. En pareil cas, la parenthèse ouvrante
\&\fIdoit\fR commencer la première ligne. Si une expression se transforme
en nombre avec une partie décimale, et si l'image correspondante
spécifie que la partie décimale doit être affichée (c'est\-à\-dire,
n'importe quelle image sauf des «\ #\ » \fBsans\fR un «\ .\ »), le caractère
utilisé pour indiquer la coupure décimale sera \fBtoujours\fR déterminé
par la locale \s-1LC_NUMERIC\s0 utilisée. Cela signifie que si
l'environnement dans lequel est lancé le script spécifie le français,
une virgule sera affichée au lieu du point. Voyez perllocale et
\&\*(L"\s-1MISE\s0 \s-1EN\s0 \s-1GARDE\s0\*(R" pour les détails.
.PP
Les champs images commençant par ^ plutôt que @ subissent un
traitement spécial. Avec un champ #, le champ est vide si la valeur
n'est pas définie. Pour d'autres types de champs, le ^ permet de
choisir un type de remplissage. Au lieu d'avoir une expression
arbitraire, la valeur spécifiée doit être une variable scalaire
contenant une chaîne de caractères. Perl met autant de texte qu'il
peut dans le champ, puis supprime de la chaîne ce qu'il a déjà
affiché\ : à l'appel suivant de la même variable, il affichera la
suite des informations. Cela signifie que la variable elle\-même est
modifiée pendant l'exécution du \fIwrite()\fR, et elle n'est pas retournée.
Vous devez normalement utiliser une séquence de champs alignés
verticalement pour afficher un bloc de texte. Vous pouvez terminer le
dernier champ par «...», qui apparaîtra si le texte est trop long
pour être affiché entièrement. Vous pouvez changer les caractères où
il est possible de changer de ligne en utilisant la variable \f(CW$:\fR
(c'est \f(CW$FORMAT_LINE_BREAK_CHARACTERS\fR si vous utilisez le module
English) pour satisfaire vos besoins.
.PP
L'utilisation des champs ^ peut produire des enregistrements de
longueur variable. Si le texte à formater est court, vous pouvez
supprimer les lignes vides en mettant un caractère «\ ~\ » (tilde)
n'importe où sur la ligne. Le tilde sera transformé en espace lors de
l'affichage. Si vous mettez un deuxième tilde contigu au premier, la
ligne sera répétée tant que les champs sur la ligne ne seront pas
vides. (si vous utilisez un champ @, l'expression que vous lui avez
donné a intérêt à ne pas donner la même valeur tout le temps\ !)
.PP
Les en\-têtes de formulaires sont par défaut pris en charge par un
format ayant le même nom que le fichier associé, avec «_TOP»
ajouté. Il est affiché en haut de chaque page. Voyez \*(L"write\*(R" in perlfunc.
.PP
Exemples\ :
.PP
.Vb 10
\& # Un rapport sur le fichier /etc/passwd
\& format STDOUT_TOP =
\& Fichier de mots de passe
\& Nom Login Bureau Uid Gid Maison
\& ------------------------------------------------------------------
\& .
\& format STDOUT =
\& @<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<<
\& $nom, $login, $bureau,$uid,$gid, $maison
\& .
.Ve
.PP
.Vb 29
\& # Un formulaire de rapport de bogue
\& format STDOUT_TOP =
\& Bug Reports
\& @<<<<<<<<<<<<<<<<<<<<<<< @||| @>>>>>>>>>>>>>>>>>>>>>>>
\& $system, $%, $date
\& ------------------------------------------------------------------
\& .
\& format STDOUT =
\& Sujet : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $sujet
\& Index : @<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $index, $description
\& Priorité : @<<<<<<<<< Date: @<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $priorite, $date, $description
\& De : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $de, $description
\& Assigné à : @<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $programmeur, $description
\& ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $description
\& ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $description
\& ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $description
\& ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $description
\& ~ ^<<<<<<<<<<<<<<<<<<<<<<<...
\& $description
\& .
.Ve
.PP
Vous pouvez mêler les \fIprint()\fR et les \fIwrite()\fR sur le même canal de
sortie, mais vous devez prendre en charge \f(CW\*(C`$\-\*(C'\fR
(\f(CW$FORMAT_LINES_LEFT\fR) vous\-même.
.Sh "Variables de formats"
.IX Subsection "Variables de formats"
Le nom du format en cours est enregistré dans la variable \f(CW$~\fR
(\f(CW$FORMAT_NAME\fR), le format d'en\-tête en cours dans \f(CW$^\fR
(\f(CW$FORMAT_TOP_NAME\fR), le numéro de la page en cours dans \f(CW$%\fR
(\f(CW$FORMAT_PAGE_NUMBER\fR), et le nombre de lignes par page dans \f(CW$=\fR
(\f(CW$FORMAT_LINES_PER_PAGE\fR). Si filehandle doit être affiché
immédiatement, on l'indique par \f(CW$|\fR (\f(CW$OUTPUT_AUTOFLUSH\fR). La
chaîne imprimée avant chaque début de page (sauf la première) est
enregistrée dans \f(CW$^L\fR (\f(CW$FORMAT_FORMFEED\fR). Ces variables sont
spécifiques à un filehandle spécifique\ : vous devrez sélectionner
celui qui vous intéresse, avec \fIselect()\fR\ :
.PP
.Vb 4
\& select((select(OUTF),
\& $~ = "Mon_Autre_Format",
\& $^ = "Mon_Top_Format"
\& )[0]);
.Ve
.PP
C'est pas beau, hein\ ? C'est pourtant assez commun, donc, ne soyez
pas trop surpris quand vous le verrez. Vous pouvez à la limite
utiliser une variable temporaire pour pouvoir récupérer le filehandle
précédent (c'est une bien meilleure approche en général, non seulement
car vous avez plusieurs étapes pour pouvoir faire joujou avec le
debuggeur)\ :
.PP
.Vb 4
\& $ofh = select(OUTF);
\& $~ = "Mon_Autre_Format";
\& $^ = "Mon_Top_Format";
\& select($ofh);
.Ve
.PP
Si vous utilisez le module English, vous pouvez même lire les noms de
variables\ :
.PP
.Vb 5
\& use English;
\& $ofh = select(OUTF);
\& $FORMAT_NAME = "Mon_Autre_Format";
\& $FORMAT_TOP_NAME = "Mon_Top_Format";
\& select($ofh);
.Ve
.PP
Mais il y a toujours les drôles de \fIselect()\fR. Donc, utilisez juste le
module FileHandle. Maintenant, vous pouvez accéder a ces variables
spéciales en utilisant des méthodes en minuscules\ :
.PP
.Vb 3
\& use FileHandle;
\& format_name OUTF "Mon_autre_Format";
\& format_top_name OUTF "Mon_Top_Format";
.Ve
.PP
Largement mieux\ !
.SH "NOTES"
.IX Header "NOTES"
Parce que les lignes contenant les valeurs peuvent contenir des
expressions arbitraires (pour les champs @, pas les ^), vous pouvez
construire des affichages très sophistiqués, comme \fIsprintf()\fR ou une
bien à vous. Par exemple\ :
.PP
.Vb 4
\& format Ident =
\& @<<<<<<<<<<<<<<<
\& &commify($n)
\& .
.Ve
.PP
Pour avoir un vrai @ ou ^ dans un champ, faites\ :
.PP
.Vb 4
\& format Ident =
\& J'ai un @ ici.
\& "@"
\& .
.Ve
.PP
Pour centrer une ligne entière de texte, faites\ :
.PP
.Vb 4
\& format Ident =
\& @|||||||||||||||||||||||||||||||||||||||||||||||
\& "Une ligne de texte"
\& .
.Ve
.PP
Il n'existe pas de façon prédéfinie de dire «\ mets ça à droite de la
page, quelle que soit sa largeur\ »\ : vous devez spécifier où chaque chose
doit aller. Dans les cas vraiment désespérés on peut générer un format
à la volée, en se basant sur le nombre de colonnes, pour ensuite
l'évaluer avec \fIeval()\fR\ :
.PP
.Vb 9
\& $format = "format STDOUT = \en"
\& . '^' . '<' x $cols . "\en"
\& . '$entry' . "\en"
\& . "\et^" . "<" x ($cols-8) . "~~\en"
\& . '$entry' . "\en"
\& . ".\en";
\& print $format if $Debugging;
\& eval $format;
\& die $@ if $@;
.Ve
.PP
qui générera un format ressemblant a quelque chose dans ce goût\-là\ :
.PP
.Vb 6
\& format STDOUT =
\& ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\& $entry
\& ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
\& $entry
\& .
.Ve
.PP
Voici un petit programme qui fait a peu près la même chose que \fIfmt\fR\|(1)\ :
.PP
.Vb 3
\& format =
\& ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
\& $_
.Ve
.PP
.Vb 1
\& .
.Ve
.PP
.Vb 5
\& $/ = '';
\& while (<>) {
\& s/\es*\en\es*/ /g;
\& write;
\& }
.Ve
.Sh "Pied de page"
.IX Subsection "Pied de page"
Alors que \f(CW$FORMAT_TOP_NAME\fR contient le nom de l'en\-tête du format en cours, il
n'y a pas de mécanisme de correspondance pour faire la même chose avec le pied
de page. L'une des causes est qu'on ne connaît pas la taille d'un format avant
qu'il ne soit évalué. C'est sur la liste des choses à faire.
.PP
Voici une première stratégie\ : si vous avez un pied de page de taille
constante, vous pouvez vérifier \f(CW$FORMAT_LINES_LEFT\fR avant chaque \fIwrite()\fR et
imprimer le pied de page quand c'est nécessaire.
.PP
Une autre stratégie consiste à ouvrir un pipe sur soi\-même, utilisant
\&\f(CW\*(C`open(MOIMEME, "|\-")\*(C'\fR (référez vous a \*(L"\fIopen()\fR\*(R" in perlfunc) et à ne faire que
des \fIwrite()\fR sur \s-1MOIMEME\s0 plutôt que \s-1STDOUT\s0. Faites en sorte que le processus
fils remanie \s-1STDIN\s0 pour ajouter le pied de page comme il vous plaît. Ce n'est
pas très pratique, mais c'est faisable.
.Sh "Accéder aux formats de l'intérieur"
.IX Subsection "Accéder aux formats de l'intérieur"
Pour un accès de bas niveau au mécanisme de formatage, vous pouvez utiliser
\&\fIformline()\fR et accéder à la variable \f(CW$^A\fR (la variable \f(CW$ACCUMULATOR\fR)
directement.
.PP
Par exemple\ :
.PP
.Vb 3
\& $str = formline <<'END', 1,2,3;
\& @<<< @||| @>>>
\& END
.Ve
.PP
.Vb 1
\& print "Yo, je viens de mettre `$^A' dans l'accumulateur !\en";
.Ve
.PP
Ou faire une routine \fIswrite()\fR, qui est à \fIwrite()\fR ce que \fIsprintf()\fR est à
\&\fIprintf()\fR, comme suit\ :
.PP
.Vb 8
\& use Carp;
\& sub swrite {
\& croak "utilisation : swrite IMAGE ARGUMENTS" unless @_;
\& my $format = shift;
\& $^A = "";
\& formline($format,@_);
\& return $^A;
\& }
.Ve
.PP
.Vb 5
\& $string = swrite(<<'END', 1, 2, 3);
\& Check me out
\& @<<< @||| @>>>
\& END
\& print $string;
.Ve
.SH "MISE EN GARDE"
.IX Header "MISE EN GARDE"
Le point isolé qui termine un format peut aussi provoquer la perte d'un
courriel passant via un serveur de mail mal configuré (et l'expérience montre
qu'une telle configuration est la règle, et non pas l'exception). Donc,
lorsque vous envoyez un format par courriel, indentez-le\ !
ainsi, le point terminant le format ne soit pas aligné à gauche\ : cela
évitera une coupe par le serveur \s-1SMTP\s0.
.PP
Les variables lexicales (déclarées avec «\ my\ ») ne sont pas visibles dans un
format sauf celui-ci est déclaré dans le champ de vision de la
variable lexicale. Ils n'étaient pas visibles du tout avant la version 5.001.
.PP
Les formats sont le seul morceau de Perl qui utilisent de façon
inconditionnelle les
informations provenant de la locale d'un programme. Si l'environnement du
programme spécifie une locale \s-1LC_NUMERIC\s0, elle sera toujours utilisée pour
spécifier le point décimal dans une sortie formatée. Perl ignore tout
simplement
le reste de la locale si le pragma \f(CW\*(C`use locale\*(C'\fR n'est pas utilisé. Les sorties
formatées ne peuvent pas prendre en compte ce pragma car il est lié a la
structure de bloc du programme, et, pour des raison historiques, les formats
sont définis hors de cette structure. Référez\-vous à perllocale pour plus
d'informations sur la gestion des locales.
.SH "TRADUCTION"
.IX Header "TRADUCTION"
.Sh "Version"
.IX Subsection "Version"
Cette traduction française correspond à la version anglaise distribuée avec
perl 5.005_02. Pour en savoir plus concernant ces traductions, consultez
.
.Sh "Traducteur"
.IX Subsection "Traducteur"
Mathieu Arnold .
.Sh "Relecture"
.IX Subsection "Relecture"
Yves Maniette ,
Gérard Delafond.