.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.05) .\" .\" 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. \*(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- .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\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" 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. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" 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 "PERLREQUICK 1" .TH PERLREQUICK 1 "2009-03-16" "DocFr" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME/NOM" .IX Header "NAME/NOM" perlrequick \- Les expressions rationnelles Perl pour les impatients .SH "DESCRIPTION" .IX Header "DESCRIPTION" Ce document de\*'crit les bases ne\*'cessaires a\*` la compre\*'hension, la cre\*'ation et l'utilisation des expressions rationnelles ou re\*'gulie\*`res (abre\*'ge\*' en regex) en Perl. .SH "Le guide" .IX Header "Le guide" .Sh "Reconnaissance de mot simple" .IX Subsection "Reconnaissance de mot simple" L'expression rationnelle la plus simple est juste un mot ou, plus ge\*'ne\*'ralement, une chai\*^ne de caracte\*`res. Une regex constitue\*'e d'un mot est reconnue dans (ou correspond avec) toutes les chai\*^nes qui contiennent ce mot\ : .PP .Vb 1 \& "Salut tout le monde" =~ /monde/; # correspondance .Ve .PP Dans cette instruction, \f(CW\*(C`monde\*(C'\fR est la regex et les \f(CW\*(C`//\*(C'\fR qui l'entourent demandent a\*` perl de rechercher une correspondance dans la chai\*^ne. L'ope\*'rateur \&\f(CW\*(C`=~\*(C'\fR applique la recherche a\*` la chai\*^ne place\*'e a\*` gauche et produit la valeur vraie si la regex correspond ou la valeur fausse sinon. Dans notre cas, \&\f(CW\*(C`monde\*(C'\fR correspond au quatrie\*`me mot de \f(CW"Salut tout le monde"\fR. Donc l'expression est vraie. Ce concept a plusieurs usages. .PP Des expressions de ce type sont utiles dans des conditions\ : .PP .Vb 1 \& print "Correspondance\en" if "Salut tout le monde" =~ /monde/; .Ve .PP Le sens de l'expression peut e\*^tre inverse\*' en utilisant l'ope\*'rateur \&\f(CW\*(C`!~\*(C'\fR\ : .PP .Vb 1 \& print "Pas de correspondance\en" if "Salut tout le monde" !~ /monde/; .Ve .PP La chai\*^ne litte\*'rale dans la regex peut e\*^tre remplace\*'e par une variable\ : .PP .Vb 2 \& $mot = "monde"; \& print "Correspondance\en" if "Salut tout le monde" =~ /$mot/; .Ve .PP Si vous voulez chercher dans \f(CW$_\fR, la partie \f(CW\*(C`$_ =~\*(C'\fR peut e\*^tre omise\ : .PP .Vb 2 \& $_ = "Salut tout le monde"; \& print "Correspondance\en" if /monde/; .Ve .PP Finalement, les de\*'limiteurs par de\*'faut \f(CW\*(C`//\*(C'\fR pour une recherche de correspondance peuvent e\*^tre remplace\*'s par des de\*'limiteurs arbitraires en les pre\*'fixant part un \f(CW\*(Aqm\*(Aq\fR\ : .PP .Vb 4 \& "Salut le monde" =~ m!monde!; # correspondance, de\*'limite\*' par \*(Aq!\*(Aq \& "Salut le monde" =~ m{monde}; # correspondance, remarquez la paire \*(Aq{}\*(Aq \& "/usr/bin/perl" =~ m"/perl"; # correspondance apre\*`s \*(Aq/usr/bin\*(Aq, \& # \*(Aq/\*(Aq devient un caracte\*`re ordinaire .Ve .PP Les regex doivent correspondre \fIexactement\fR a\*` une partie de la chai\*^ne pour e\*^tre reconnue\ : .PP .Vb 3 \& "Salut le monde" =~ /Monde/; # pas de correspondance, casse diffe\*'rente \& "Salut le monde" =~ /e m/; # correspondance, \*(Aq \*(Aq est un caracte\*`re ordinaire \& "Salut le monde" =~ /monde /; # pas de correspondance, pas de \*(Aq \*(Aq a\*` la fin .Ve .PP La reconnaissance a lieu le plus to\*^t possible dans la chai\*^ne\ : .PP .Vb 2 \& "Salut le monde" =~ /l/; # reconnai\*^t le \*(Aql\*(Aq dans \*(AqSalut \& "La peste est la\*`" =~ /est/; # reconnai\*^t le \*(Aqest\*(Aq dans \*(Aqpeste\*(Aq .Ve .PP Certains caracte\*`res ne peuvent e\*^tre utilise\*'s tels quels dans une regex. Ces caracte\*`res, appele\*'s \fBmeta\-caracte\*`res\fR, sont re\*'serve\*'s pour des notations spe\*'ciales dans les expressions rationnelles. Les voici\ : .PP .Vb 1 \& {}[]()^$.|*+?\e .Ve .PP Un meta\-caracte\*`re peut\-e\*^tre utilise\*' en le pre\*'fixant par un backslash (une barre oblique inverse\*'e)\ : .PP .Vb 4 \& "2+2=4" =~ /2+2/; # pas de correspondance, + est un meta\-caracte\*`re \& "2+2=4" =~ /2\e+2/; # correspondance, \e+ est traite\*' comme un + ordinaire \& \*(AqC:\eWIN32\*(Aq =~ /C:\e\eWIN/; # correspondance \& "/usr/bin/perl" =~ /\e/usr\e/bin\e/perl/; # correspondance .Ve .PP Dans ce dernier exemple, le symbole divise\*' \f(CW\*(C`/\*(C'\fR est aussi pre\*'fixe\*' par un backslash car il est utilise\*' comme de\*'limiteur par l'expression rationnelle. .PP Les caracte\*`res \s-1ASCII\s0 non affichables sont repre\*'sente\*'s par des \fBse\*'quences d'e\*'chappement\fR. Les exemples courants sont \f(CW\*(C`\et\*(C'\fR pour une tabulation, \f(CW\*(C`\en\*(C'\fR pour un passage a\*` la ligne et \f(CW\*(C`\er\*(C'\fR pour un retour chariot. Les octets quelconques sont repre\*'sente\*'s par une se\*'quence d'e\*'chappement en octal (comme \&\f(CW\*(C`\e033\*(C'\fR) ou en hexade\*'cimal (comme \f(CW\*(C`\ex1B\*(C'\fR)\ : .PP .Vb 3 \& "1000\et2000" =~ m(0\et2) # correspondance \& "chat" =~ /\e143\e150\ex61\ex74/ # correspondance, \& # mais \*(Aqchat\*(Aq est e\*'crit bizarrement .Ve .PP Les expressions rationnelles sont traite\*'es quasiment comme des chai\*^nes entre guillemets. Donc l'interpolation des variables fonctionne\ : .PP .Vb 3 \& $foo = \*(Aqson\*(Aq; \& \*(Aqcaisson\*(Aq =~ /cais$foo/; # correspondance \& \*(Aqsonnet\*(Aq =~ /${foo}net/; # correspondance .Ve .PP Dans toutes les expressions rationnelles qui pre\*'ce\*`dent, si la regex est reconnue quelque part dans la chai\*^ne, on conside\*`re qu'il y a correspondance. Pour spe\*'cifier \fIou\*`\fR doit avoir lieu la reconnaissance, vous pouvez utiliser les meta\-caracte\*`res d'\fBancrage\fR \f(CW\*(C`^\*(C'\fR et \f(CW\*(C`$\*(C'\fR. L'ancre \f(CW\*(C`^\*(C'\fR est reconnue au de\*'but de la chai\*^ne alors que l'ancre \f(CW\*(C`$\*(C'\fR est reconnue a\*` la fin de la chai\*^ne ou juste avant une fin de ligne a\*` la fin de la chai\*^ne. Quelques exemples\ : .PP .Vb 5 \& "housekeeper" =~ /keeper/; # correspondance \& "housekeeper" =~ /^keeper/; # pas de correspondance \& "housekeeper" =~ /keeper$/; # correspondance \& "housekeeper\en" =~ /keeper$/; # correspondance \& "housekeeper" =~ /^housekeeper$/; # correspondance .Ve .Sh "Utilisation des classes de caracte\*`res" .IX Subsection "Utilisation des classes de caracte`res" Une \fBclasse de caracte\*`res\fR de\*'finit un ensemble de caracte\*`res acceptables en un point particulier de l'expression rationnelle. Une classe de caracte\*`res s'exprime par une paire de crochets \f(CW\*(C`[...]\*(C'\fR contenant l'ensemble des caracte\*`res acceptables. Voici quelques exemples\ : .PP .Vb 3 \& /rame/; # reconnai\*^t \*(Aqrame\*(Aq \& /[clr]ame/; # reconnai\*^t \*(Aqcame, \*(Aqlame\*(Aq ou \*(Aqrame\*(Aq \& "abc" =~ /[cab]/; # reconnai\*^t \*(Aqa\*(Aq .Ve .PP Dans la dernie\*`re instruction, bien que \f(CW\*(Aqc\*(Aq\fR soit le premier caracte\*`re de la classe, le premier endroit ou\*` cette expression rationnelle peut e\*^tre reconnue est le \f(CW\*(Aqa\*(Aq\fR. .PP .Vb 3 \& /[oO][uU][iI]/; # reconnai\*^t \*(Aqoui\*(Aq inde\*'pendamment de la casse \& # \*(Aqoui\*(Aq, \*(AqOui\*(Aq, \*(AqOUI\*(Aq, etc. \& /oui/i; # reconnai\*^t aussi \*(Aqoui\*(Aq inde\*'pendamment de la casse .Ve .PP Le dernier exemple de\*'montre l'usage du modificateur \f(CW\*(Aqi\*(Aq\fR qui permet une mise en correspondance inde\*'pendante de la casse (majuscule/minuscule). .PP Les classes de caracte\*`res ont elles aussi leurs caracte\*`res normaux et spe\*'ciaux mais ce ne sont pas les me\*^mes qu'a\*` l'exte\*'rieur d'une classe. Les caracte\*`res spe\*'ciaux sont \f(CW\*(C`\-]\e^$\*(C'\fR. Pour les rendre normaux, il faut les pre\*'fixer par \&\f(CW\*(C`\e\*(C'\fR\ : .PP .Vb 5 \& /[\e]c]def/; # correspond a\*` \*(Aq]def\*(Aq ou \*(Aqcdef\*(Aq \& $x = \*(Aqclr\*(Aq; \& /[$x]ame/; # correspond a\*` \*(Aqcame, \*(Aqlame\*(Aq ou \*(Aqrame\*(Aq \& /[\e$x]ame/; # correspond a\*` \*(Aq$ame\*(Aq or \*(Aqxame\*(Aq \& /[\e\e$x]ame/; # correspond a\*` \*(Aq\eame\*(Aq, \*(Aqcame, \*(Aqlame\*(Aq ou \*(Aqrame\*(Aq .Ve .PP Le caracte\*`re spe\*'cial \f(CW\*(Aq\-\*(Aq\fR agit a\*` l'inte\*'rieur d'une classe comme un ope\*'rateur d'intervalle. Donc les classes peu maniables \f(CW\*(C`[0123456789]\*(C'\fR et \&\f(CW\*(C`[abcde...xyz]\*(C'\fR deviennent \f(CW\*(C`[0\-9]\*(C'\fR et \f(CW\*(C`[a\-z]\*(C'\fR\ : .PP .Vb 2 \& /item[0\-9]/; # reconnai\*^t \*(Aqitem0\*(Aq ou \*(Aqitem1\*(Aq ... ou \*(Aqitem9\*(Aq \& /[0\-9a\-fA\-F]/; # reconnai\*^t un chiffre hexade\*'cimal .Ve .PP Si \f(CW\*(Aq\-\*(Aq\fR est le premier ou le dernier caracte\*`re d'une classe de caracte\*`res, il est traite\*' comme un caracte\*`re ordinaire. .PP Le caracte\*`re \f(CW\*(C`^\*(C'\fR est spe\*'cial en premie\*`re position de la classe. Il indique alors une \fBclasse de caracte\*`res comple\*'mentaire\fR qui reconnai\*^t tous les caracte\*`res sauf ceux pre\*'sents entre les crochets. Qu'elle soit de la forme \&\f(CW\*(C`[...]\*(C'\fR ou \f(CW\*(C`[^...]\*(C'\fR, une classe de caracte\*`res doit correspondre a\*` un caracte\*`re sinon la reconnaissance e\*'choue. Donc\ : .PP .Vb 4 \& /[^a]at/; # ne reconnai\*^t ni \*(Aqaat\*(Aq ni \*(Aqat\*(Aq, mais reconnai\*^t \& # \*(Aqbat\*(Aq, \*(Aqcat, \*(Aq0at\*(Aq, \*(Aq%at\*(Aq, etc. \& /[^0\-9]/; # reconnai\*^t un caracte\*`re non nume\*'rique \& /[a^]at/; # reconnai\*^t \*(Aqaat\*(Aq ou \*(Aq^at\*(Aq; dans ce cas \*(Aq^\*(Aq est ordinaire .Ve .PP Perl propose plusieurs abre\*'viations pour des classes de caracte\*`res courantes\ : .IP "\(bu" 4 \&\ed est un chiffre et est e\*'quivalent a\*` .Sp .Vb 1 \& [0\-9] .Ve .IP "\(bu" 4 \&\es est un blanc et est e\*'quivalent a\*` .Sp .Vb 1 \& [\e \et\er\en\ef] .Ve .IP "\(bu" 4 \&\ew est caracte\*`re \fImot\fR (alphanume\*'rique ou _) et est e\*'quivalent a\*` .Sp .Vb 1 \& [0\-9a\-zA\-Z_] .Ve .IP "\(bu" 4 \&\eD est la ne\*'gation de \ed; il repre\*'sente tout autre caracte\*`re qu'un chiffre .Sp .Vb 1 \& [^0\-9] .Ve .IP "\(bu" 4 \&\eS est la ne\*'gation de \es .Sp .Vb 1 \& [^\es] .Ve .IP "\(bu" 4 \&\eW est la ne\*'gation de \ew .Sp .Vb 1 \& [^\ew] .Ve .IP "\(bu" 4 Le point '.' reconnai\*^t n'importe quel caracte\*`re sauf \*(L"\en\*(R". .PP Les abre\*'viations \f(CW\*(C`\ed\es\ew\eD\eS\eW\*(C'\fR peuvent e\*^tre utilise\*'es a\*` l'exte\*'rieur ou a\*` l'inte\*'rieur d'une classe de caracte\*`res. Quelques exemples\ : .PP .Vb 7 \& /\ed\ed:\ed\ed:\ed\ed/; # reconnai\*^t une heure au format hh:mm:ss \& /[\ed\es]/; # reconnai\*^t un chiffre ou un blanc \& /\ew\eW\ew/; # reconnai\*^t un caracte\*`re mot suivi d\*(Aqun caracte\*`re \& # non mot, suivi d\*(Aqun caracte\*`re mot \& /..rt/; # reconnai\*^t deux caracte\*`res quelconques suivis de \*(Aqrt\*(Aq \& /fin\e./; # reconnai\*^t \*(Aqfin.\*(Aq \& /fin[.]/; # idem, reconnai\*^t \*(Aqfin.\*(Aq .Ve .PP L'ancre \f(CW\*(C`\eb\*(C'\fR est reconnue a\*` la limite de mot\ : entre un caracte\*`re mot et un caracte\*`re non mot (entre \f(CW\*(C`\ew\eW\*(C'\fR ou entre \f(CW\*(C`\eW\ew\*(C'\fR). .PP .Vb 4 \& $x = "Housecat catenates house and cat"; \& $x =~ /\ebcat/; # reconnai\*^t cat dans \*(Aqcatenates\*(Aq \& $x =~ /cat\eb/; # reconnai\*^t cat dans \*(Aqhousecat\*(Aq \& $x =~ /\ebcat\eb/; # reconnai\*^t \*(Aqcat\*(Aq en fin de chai\*^ne .Ve .PP Dans le dernier exemple, la fin de la chai\*^ne est conside\*'re\*'e comme une limite de mot. .Sh "Reconnai\*^tre ceci ou cela" .IX Subsection "Reconnai^tre ceci ou cela" Nous pouvons reconnai\*^tre diffe\*'rentes chai\*^nes gra\*^ce au meta\-caracte\*`re d'alternative \f(CW\*(C`|\*(C'\fR. Pour reconnai\*^tre \f(CW\*(C`chien\*(C'\fR ou \f(CW\*(C`chat\*(C'\fR, nous pouvons utiliser la regex \f(CW\*(C`chien|chat\*(C'\fR. Comme pre\*'ce\*'demment, perl essayera de reconnai\*^tre la regex le plus to\*^t possible dans la chai\*^ne. A\*` chaque position, perl essayera la premie\*`re possibilite\*'\ : \f(CW\*(C`chien\*(C'\fR. Si \f(CW\*(C`chien\*(C'\fR ne correspond pas, perl essayera la possibilite\*' suivante\ : \f(CW\*(C`chat\*(C'\fR. Si \f(CW\*(C`chat\*(C'\fR ne convient pas non plus alors il n'y a pas correspondance et perl se de\*'place a\*` la position suivante dans la chai\*^ne. Quelques exemples\ : .PP .Vb 2 \& "chiens et chats" =~ /chien|chat|rat/; # reconnai\*^t "chien" \& "chiens et chats" =~ /chat|chien|rat/; # reconnai\*^t "chien" .Ve .PP Bien que \f(CW\*(C`chat\*(C'\fR soit la premie\*`re possibilite\*' dans la seconde regex, \f(CW\*(C`chien\*(C'\fR est reconnue plus to\*^t dans la chai\*^ne. .PP .Vb 2 \& "chat" =~ /c|ch|cha|chat/; # reconnai\*^t "c" \& "chat" =~ /chat|cha|ch|c/; # reconnai\*^t "chat" .Ve .PP En une position donne\*'e, la possibilite\*' qui est retenue est la premie\*`re qui permet la reconnaissance de l'expression. Ici, toute les possibilite\*'s correspondent de\*`s le premier caracte\*`re donc c'est la premie\*`re qui est retenue. .Sh "Groupement et hie\*'rarchie" .IX Subsection "Groupement et hie'rarchie" Les meta\-caracte\*`res de regroupement \f(CW\*(C`()\*(C'\fR permettent de traiter une partie d'une regex comme une seule entite\*'. Une partie d'une regex est groupe\*'e en l'entourant de parenthe\*`ses. L'expression \f(CW\*(C`para(pluie|chute)\*(C'\fR peut reconnai\*^tre \&\f(CW\*(C`para\*(C'\fR suivi soit de \f(CW\*(C`pluie\*(C'\fR soit de \f(CW\*(C`chute\*(C'\fR. D'autres exemples\ : .PP .Vb 2 \& /(a|b)b/; # reconnai\*^t \*(Aqab\*(Aq ou \*(Aqbb\*(Aq \& /(^a|b)c/; # reconnai\*^t \*(Aqac\*(Aq au de\*'but de la chai\*^ne ou \*(Aqbc\*(Aq n\*(Aqimporte ou\*` \& \& /chat(on|)/; # reconnai\*^t \*(Aqchaton\*(Aq ou \*(Aqchat\*(Aq. \& /chat(on(s|)|)/; # reconnai\*^t \*(Aqchatons\*(Aq ou \*(Aqchaton\*(Aq ou \*(Aqchat\*(Aq. \& # Notez que les groupes peuvent e\*^tre imbrique\*'s \& \& "20" =~ /(19|20|)\ed\ed/; # reconnai\*^t la possibilite\*' vide \*(Aq()\ed\ed\*(Aq, \& # puisque \*(Aq20\ed\ed\*(Aq ne peut pas correspondre .Ve .Sh "Me\*'morisation de la correspondance" .IX Subsection "Me'morisation de la correspondance" Les meta\-caracte\*`res de regroupement \f(CW\*(C`()\*(C'\fR permettent aussi la me\*'morisation de la partie reconnue de la chai\*^ne. Pour chaque groupe, la partie reconnue de la chai\*^ne va dans une variable spe\*'ciale \f(CW$1\fR ou \f(CW$2\fR, etc. Elles peuvent e\*^tre utilise\*'es comme des variables ordinaires\ : .PP .Vb 5 \& # extraction des heures, minutes, secondes \& $temps =~ /(\ed\ed):(\ed\ed):(\ed\ed)/; # reconnai\*^t le format hh:mm:ss \& $heures = $1; \& $minutes = $2; \& $secondes = $3; .Ve .PP Dans un contexte de liste, une mise en correspondance \f(CW\*(C`/regex/\*(C'\fR avec regroupement retourne la liste des valeurs \f(CW\*(C`($1, $2, ...)\*(C'\fR. Nous pouvons donc e\*'crire\ : .PP .Vb 1 \& ($heures, $minutes, $secondes) = ($temps =~ /(\ed\ed):(\ed\ed):(\ed\ed)/); .Ve .PP Si les regroupements sont imbrique\*'s, \f(CW$1\fR sera le groupe ayant la parenthe\*`se ouvrante la plus a\*` gauche, \f(CW$2\fR celui ayant la parenthe\*`se ouvrante suivante, etc. Voici une expression rationnelle complexe avec les nume\*'ros des variables de groupes indique\*'s au-dessous\ : .PP .Vb 2 \& /(ab(cd|ef)((gi)|j))/; \& 1 2 34 .Ve .PP Les re\*'fe\*'rences arrie\*`res \f(CW\*(C`\e1\*(C'\fR, \f(CW\*(C`\e2\*(C'\fR... sont associe\*'es aux variables \f(CW$1\fR, \&\f(CW$2\fR... Les re\*'fe\*'rences arrie\*`res sont utilise\*'es \fIdans\fR l'expression rationnelle elle\-me\*^me\ : .PP .Vb 1 \& /(\ew\ew\ew)\es\e1/; # trouve les se\*'quences telles que \*(Aqles les\*(Aq dans la chai\*^ne .Ve .PP \&\f(CW$1\fR, \f(CW$2\fR... ne devraient e\*^tre utilise\*' qu'a\*` l'exte\*'rieur de l'expression tandis que \f(CW\*(C`\e1\*(C'\fR, \f(CW\*(C`\e2\*(C'\fR ne devraient l'e\*^tre qu'a\*` l'inte\*'rieur. .Sh "Re\*'pe\*'titions et quantificateurs" .IX Subsection "Re'pe'titions et quantificateurs" Les meta\-caracte\*`res ou quantificateurs \f(CW\*(C`?\*(C'\fR, \f(CW\*(C`*\*(C'\fR et \f(CW\*(C`{}\*(C'\fR nous permettent de fixer le nombre de re\*'pe\*'titions d'une portion de regex. Un quantificateur est place\*' juste apre\*`s le caracte\*`re, la classe de caracte\*`res ou le regroupement a\*` re\*'pe\*'ter. Ils ont le sens suivant\ : .IP "\(bu" 4 \&\f(CW\*(C`a?\*(C'\fR : reconnai\*^t 'a' ze\*'ro ou une fois. .IP "\(bu" 4 \&\f(CW\*(C`a*\*(C'\fR : reconnai\*^t 'a' ze\*'ro fois ou plus. .IP "\(bu" 4 \&\f(CW\*(C`a+\*(C'\fR : reconnai\*^t 'a' au moins une fois. .IP "\(bu" 4 \&\f(CW\*(C`a{n,m}\*(C'\fR : reconnai\*^t 'a' au moins \f(CW\*(C`n\*(C'\fR fois, mais pas plus de \f(CW\*(C`m\*(C'\fR fois. .IP "\(bu" 4 \&\f(CW\*(C`a{n,}\*(C'\fR : reconnai\*^t 'a' au moins \f(CW\*(C`n\*(C'\fR fois. .IP "\(bu" 4 \&\f(CW\*(C`a{n}\*(C'\fR : reconnai\*^t 'a' exactement \f(CW\*(C`n\*(C'\fR fois. .PP Voici quelques exemples\ : .PP .Vb 6 \& /[a\-z]+\es+\ed*/; # reconnai\*^t un mot en minuscules suivi d\*(Aqau moins un blanc \& # et e\*'ventuellement d\*(Aqun certain nombre de chiffres \& /(\ew+)\es+\e1/; # reconnai\*^t la re\*'pe\*'tition d\*(Aqun mot de longueur quelconque \& $annee =~ /\ed{2,4}/; # s\*(Aqassure que l\*(Aqanne\*'e contient au moins 2 chiffres et \& # pas plus de 4 chiffres \& $annee =~ /\ed{4}|\ed{2}/; # meilleure reconnaissance; exclut le cas de 3 chiffres .Ve .PP Ces quantificateurs essayent d'entrer en correspondance avec la chai\*^ne la plus longue possible tout en permettant a\*` la regex d'e\*^tre reconnue (ils sont gourmands). Donc\ : .PP .Vb 5 \& $x = \*(AqCe chien est le mien\*(Aq; \& $x =~ /^(.*)(ien)(.*)$/; # correspondance, \& # $1 = \*(AqCe chien est le m\*(Aq \& # $2 = \*(Aqien\*(Aq \& # $3 = \*(Aq\*(Aq (aucun caracte\*`re) .Ve .PP Le premier quantificateur \f(CW\*(C`.*\*(C'\fR consomme la chai\*^ne la plus longue possible tout en laissant une possibilite\*' de correspondance pour la regex globale. Le second quantificateur \f(CW\*(C`.*\*(C'\fR n'a plus de caracte\*`re disponible donc il est reconnu ze\*'ro fois. .Sh "Plus de correspondances" .IX Subsection "Plus de correspondances" Il y a encore quelques de\*'tails que vous devez connai\*^tre a\*` propos des ope\*'rateurs de correspondance. Dans le code .PP .Vb 4 \& $motif = \*(AqSeuss\*(Aq; \& while (<>) { \& print if /$motif/; \& } .Ve .PP perl doit re\*'e\*'valuer \f(CW$motif\fR a\*` chaque passage dans la boucle. Si \f(CW$motif\fR ne change jamais, utilisez le modificateur \f(CW\*(C`//o\*(C'\fR pour n'effectuer qu'une seule fois l'interpolation. Si vous ne voulez aucune interpolation, utilisez les de\*'limiteurs spe\*'ciaux \f(CW\*(C`m\*(Aq\*(Aq\*(C'\fR\ : .PP .Vb 3 \& @motif = (\*(AqSeuss\*(Aq); \& m/@motif/; # reconnai\*^t \*(AqSeuss\*(Aq \& m\*(Aq@motif\*(Aq; # reconnai\*^t la chai\*^ne litte\*'rale \*(Aq@motif\*(Aq .Ve .PP Le modificateur \f(CW\*(C`//g\*(C'\fR demande a\*` l'ope\*'rateur de mise en correspondance de s'appliquer a\*` une chai\*^ne autant de fois que possible. Dans un contexte scalaire, une recherche de correspondance assortie du modificateur \f(CW\*(C`//g\*(C'\fR sautera de reconnaissance en reconnaissance en se souvenant a\*` chaque fois de l'endroit ou\*` elle s'est arre\*^te\*'e la fois pre\*'ce\*'dente. Vous pouvez re\*'cupe\*'rer la position atteinte via la fonction \f(CW\*(C`pos()\*(C'\fR. Par exemple\ : .PP .Vb 4 \& $x = "chien chat maison"; # 3 mots \& while ($x =~ /(\ew+)/g) { \& print "le mot $1 se termine en ", pos $x, "\en"; \& } .Ve .PP affiche .PP .Vb 3 \& le mot chien se termine en 5 \& le mot chat se termine en 10 \& le mot maison se termine en 17 .Ve .PP L'e\*'chec de la reconnaissance ou la modification de la chai\*^ne re\*'initialise la position. Si vous ne voulez pas de re\*'initialisation en cas d'e\*'chec, ajoutez le modificateur \f(CW\*(C`//c\*(C'\fR comme dans \f(CW\*(C`/regex/gc\*(C'\fR. .PP Dans un contexte de liste, \f(CW\*(C`//g\*(C'\fR retournera la liste comple\*`te des groupes reconnus ou, si il n'y a pas de regroupement, la liste des sous\-chai\*^nes reconnues par la regex comple\*`te. Donc\ : .PP .Vb 4 \& @mots = ($x =~ /(\ew+)/g); # correspondance, \& # $mots[0] = \*(Aqchien\*(Aq \& # $mots[1] = \*(Aqchat\*(Aq \& # $mots[2] = \*(Aqmaison\*(Aq .Ve .Sh "Recherche et remplacement" .IX Subsection "Recherche et remplacement" On effectue une recherche et remplacement en utilisant \&\f(CW\*(C`s/regex/remplacement/modificateurs\*(C'\fR. \f(CW\*(C`remplacement\*(C'\fR est comme une chai\*^ne Perl entre guillemets qui remplacera dans la chai\*^ne la partie reconnue par la \&\f(CW\*(C`regex\*(C'\fR. La\*` aussi, l'ope\*'rateur \f(CW\*(C`=~\*(C'\fR permet de choisir a\*` quelle chai\*^ne sera applique\*'e \f(CW\*(C`s///\*(C'\fR. Si \f(CW\*(C`s///\*(C'\fR doit s'appliquer a\*` \f(CW$_\fR, il est possible d'omettre \f(CW\*(C`$_\ =~\*(C'\fR. S'il y a une correspondance, \f(CW\*(C`s///\*(C'\fR retourne le nombre de remplacements effectue\*'s sinon il retourne faux. Voici quelques exemples\ : .PP .Vb 5 \& $x = "Time to feed the cat!"; \& $x =~ s/cat/hacker/; # $x contient "Time to feed the hacker!" \& $y = "\*(Aqquoted words\*(Aq"; \& $y =~ s/^\*(Aq(.*)\*(Aq$/$1/; # supprime les apostrophes, \& # $y contient "quoted words" .Ve .PP Lorsqu'on utilise l'ope\*'rateur \f(CW\*(C`s///\*(C'\fR, les variables \f(CW$1\fR, \f(CW$2\fR, etc. sont directement utilisables dans l'expression de remplacement. Avec le modificateur \f(CW\*(C`s///g\*(C'\fR, la recherche et remplacement auront lieu sur toutes les occurrences de l'expression rationnelle\ : .PP .Vb 4 \& $x = "I batted 4 for 4"; \& $x =~ s/4/four/; # $x contient "I batted four for 4" \& $x = "I batted 4 for 4"; \& $x =~ s/4/four/g; # $x contient "I batted four for four" .Ve .PP Le modificateur d'e\*'valuation \f(CW\*(C`s///e\*(C'\fR ajoute un \f(CW\*(C`eval{...}\*(C'\fR autour de la chai\*^ne de remplacement et c'est le re\*'sultat de cette e\*'valuation qui sera substitue\*' a\*` la sous\-chai\*^ne reconnue. Quelques\ exemples\ : .PP .Vb 3 \& # inverser tous les mots d\*(Aqune chai\*^ne \& $x = "the cat in the hat"; \& $x =~ s/(\ew+)/reverse $1/ge; # $x contient "eht tac ni eht tah" \& \& # convertir un pourcentage en fraction \& $x = "A 39% hit rate"; \& $x =~ s!(\ed+)%!$1/100!e; # $x contient "A 0.39 hit rate" .Ve .PP Le dernier exemple montre que \f(CW\*(C`s///\*(C'\fR peut utiliser d'autres de\*'limiteurs tels que \f(CW\*(C`s!!!\*(C'\fR ou \f(CW\*(C`s{}{}\*(C'\fR... ou me\*^me \f(CW\*(C`s{}//\*(C'\fR. Si les de\*'limiteurs sont des apostrophes \f(CW\*(C`s\*(Aq\*(Aq\*(Aq\*(C'\fR alors l'expression rationnelle et la chai\*^ne de remplacement sont conside\*'re\*'es comme des chai\*^nes entre apostrophes (pas d'interpolation des variables). .Sh "L'ope\*'rateur de de\*'coupage\ : split" .IX Subsection "L'ope'rateur de de'coupage: split" \&\f(CW\*(C`split /regex/, chaine\*(C'\fR de\*'coupe \f(CW\*(C`chaine\*(C'\fR en une liste de sous\-chai\*^nes et retourne cette liste. La regex de\*'termine la se\*'quence de caracte\*`res a\*` utiliser comme se\*'parateur lors du de\*'coupage de \f(CW\*(C`string\*(C'\fR. Par exemple, pour de\*'couper une chai\*^ne en mots, utilisez\ : .PP .Vb 4 \& $x = "Calvin and Hobbes"; \& @mots = split /\es+/, $x; # $mots[0] = \*(AqCalvin\*(Aq \& # $mots[1] = \*(Aqand\*(Aq \& # $mots[2] = \*(AqHobbes\*(Aq .Ve .PP Pour extraire une liste de nombres se\*'pare\*'s par des points-virgules\ : .PP .Vb 4 \& $x = "1,618;2,718; 3,142"; \& @const = split /;\es*/, $x; # $const[0] = \*(Aq1,618\*(Aq \& # $const[1] = \*(Aq2,718\*(Aq \& # $const[2] = \*(Aq3,142\*(Aq .Ve .PP Si vous utilisez l'expression rationnelle vide \f(CW\*(C`//\*(C'\fR, la chai\*^ne est de\*'coupe\*'e en ses caracte\*`res. Si l'expression rationnelle contient des regroupements alors la liste produite contiendra aussi les groupes reconnus\ : .PP .Vb 6 \& $x = "/usr/bin"; \& @parts = split m!(/)!, $x; # $parts[0] = \*(Aq\*(Aq \& # $parts[1] = \*(Aq/\*(Aq \& # $parts[2] = \*(Aqusr\*(Aq \& # $parts[3] = \*(Aq/\*(Aq \& # $parts[4] = \*(Aqbin\*(Aq .Ve .PP Puisque le premier caracte\*`re de \f(CW$x\fR est reconnu comme de\*'limiteur, \f(CW\*(C`split\*(C'\fR ajoute un e\*'le\*'ment vide au de\*'but de la liste. .SH "BUGS" .IX Header "BUGS" Aucun. .SH "VOIR AUSSI" .IX Header "VOIR AUSSI" C'est un simple guide d'introduction. Pour un tutoriel plus complet voir perlretut et pour une re\*'fe\*'rence comple\*`te voir perlre. .SH "AUTEUR ET COPYRIGHT" .IX Header "AUTEUR ET COPYRIGHT" Copyright (c) 2000 Mark Kvale All rights reserved. .PP This document may be distributed under the same terms as Perl itself. .PP Tous droits re\*'serve\*'s. .PP Ce document peut e\*^tre distribuer sous les me\*^mes termes que Perl. .Sh "Remerciements" .IX Subsection "Remerciements" L'auteur tient a\*` remercier Mark-Jason Dominus, Tom Christiansen, Ilya Zakharevich, Brad Hughes et Mike Giroux pour leurs commentaires pre\*'cieux. .SH "TRADUCTION" .IX Header "TRADUCTION" .Sh "Version" .IX Subsection "Version" Cette traduction franc\*,aise correspond a\*` la version anglaise distribue\*'e avec perl 5.10.0. Pour en savoir plus concernant ces traductions, consultez . .Sh "Traducteur" .IX Subsection "Traducteur" Paul Gaborit (Paul.Gaborit at enstimac.fr). .Sh "Relecture" .IX Subsection "Relecture" Aucune pour l'instant.