<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//FR">
<HTML>
<HEAD>
 <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <META NAME="GENERATOR" CONTENT="lfparser_2.8">
 <META NAME="LFCATEGORY" CONTENT="Software Development">
 <TITLE>lf136, Software Development: Perl partie III</TITLE>
<!-- stylesheet added by lfparser: --> 
<style type="text/css">
<!--
 pre { font-familiy:monospace,Courier }
-->
</style>
 
</HEAD>
<BODY bgcolor="#ffffff" text="#000000">
 <!-- this is generated html code. NEVER use this file for your
 translation work. Instead get the file with the same article number
 and .meta.shtml in its name. Translate this meta file and then
 use lfparser program to generate the final article -->
 <!-- lfparser can be obtained from http://main.linuxfocus.org/~guido/dev/lfparser.html -->

<!-- 2pdaIgnoreStart -->

<MAP name="top">
  <AREA shape="rect" coords="367,9,418,30" alt="Sommaire" href="../index.shtml">
  <AREA shape="rect" coords="423,9,457,30" alt="Carte" href="../map.html">
  <AREA shape="rect" coords="463,9,508,30" alt="Index" href="../Themes/index.html">
  <AREA shape="rect" coords="514,9,558,30" alt="Recherche" href="../Search/index.html">
</MAP>
<MAP name="bottom">
  <AREA shape="rect" coords="78,0,163,15" alt="Nouvelles" href="../News/index.shtml">
  <AREA shape="rect" coords="189,0,284,15" alt="Archives" href="../Archives/index.html">
  <AREA shape="rect" coords="319,0,395,15" alt="Liens" href="../Links/index.html">
  <AREA shape="rect" coords="436,0,523,15" alt="A propos" href="../aboutus.html">
</MAP>
<!-- IMAGE HEADER -->
<CENTER>
  <IMG src="../../common/images/Topbar-fr.gif" width="600" height="40" border="0" alt="[Barre Superieure]" ismap usemap="#top" ><BR>
  <IMG src="../../common/images/Bottombar-fr.gif" width="600" height="21" border="0" alt="[Barre Inferieure]" ismap usemap="#bottom">
</CENTER>
<!-- SSI_INFO -->

<!-- tr_staticssi include virtual -->
<!-- tr_staticssi exec cmd -->
<!-- addedByLfdynahead ver 1.1 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Cet article est disponible en: <A href="../../English/January2000/article136.shtml">English</a> &nbsp;<A href="../../Castellano/January2000/article136.html">Castellano</a> &nbsp;<A href="../../Deutsch/January2000/article136.shtml">Deutsch</a> &nbsp;<A href="../../Francais/January2000/article136.shtml">Francais</a> &nbsp;<A href="../../Nederlands/January2000/article136.shtml">Nederlands</a> &nbsp;<A href="../../Turkce/January2000/article136.shtml">Turkce</a> &nbsp;</FONT></TD></TR></TABLE><br>
 

<!-- 2pdaIgnoreStop -->

<!-- SHORT BIO ABOUT THE AUTHOR -->
<TABLE ALIGN=LEFT BORDER=0 hspace=4 vspace=4 WIDTH="30%" >
<TR>
<TD>

<!-- 2pdaIgnoreStart -->
<!-- PALM DOC -->
<TABLE BORDER=0 hspace=4 vspace=4> <TR> <TD>
<font size=1> <img src="../../common/images/2doc.gif" width=34 align=left border=0 height=22 alt="convert to palm"><a href="http://cgi.linuxfocus.org/cgi-bin/2ztxt">Convert to GutenPalm</a><br>or <a href="http://cgi.linuxfocus.org/cgi-bin/2pda">to PalmDoc</a></font>
</TD> </TR> </TABLE>
<!-- END PALM DOC -->
<!-- 2pdaIgnoreStop -->
<br>
<IMG SRC="../../common/images/Guido-S.gif" ALT="[Photo of the Author]" HEIGHT=164 WIDTH=173>
<BR>par  <A HREF="mailto:guido.socher@linuxfocus.org">Guido Socher</A>
<BR><BR>
<I>L&acute;auteur:</I><BR>
<P>
Guido est un fan de Linux de longue date et un passionn&eacute; de Perl.
Vous pouvez visiter sa home page Linux &agrave;
<a href="http://www.oche.de/~bearix/g/">www.oche.de/~bearix/g/</a>.
</P>
<BR><i>Sommaire</i>:
<UL>
  <LI><A HREF="#lfindex0">Tableaux de variables</A></LI>
  <LI><A HREF="#lfindex1">Boucles sur les tableaux</A></LI>
  <LI><A HREF="#lfindex2">La ligne de commande</A></LI>
  <LI><A HREF="#lfindex3">Une pile</A></LI>
  <LI><A HREF="#lfindex4">Lire des r&eacute;pertoires</A></LI>
  <LI><A HREF="#lfindex5">Un outil pour la recherche de fichier</A></LI>
  <LI><A HREF="#lfindex6"> R&eacute;f&eacute;rences </A></LI>
  <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=136&lang=fr">Discussion sur cet article</A></LI>
</UL>

</TD></TR></TABLE>
<!-- HEAD OF THE ARTICLE -->
<H2>Perl partie III</H2>
 <IMG SRC="../../common/images/illustration114.gif" ALT="[Illustration]" HSPACE=10 HEIGHT=100 WIDTH=100>
<!-- ABSTRACT OF THE ARTICLE -->
<P><i>R&eacute;sum&eacute;</i>:
<P>
<a href="../September1999/article114.html">
Perl partie I </a> offrait une vue d'ensemble de Perl.
Dans perl <a href="../November1999/article126.html">partie II</a> nous &eacute;crivions notre premier programme.
Dans la partie III nous allons regarder de plus pr&egrave;s les tableaux de variables.

</P>
<HR size="2" noshade align="right"><BR>
<!-- BODY OF THE ARTICLE -->


<A NAME="lfindex0">&nbsp;</A>
<H2>Tableaux de variables</H2>


<p>Un tableau consiste en une liste de variables &agrave; laquelle vous acc&eacute;dez par un indice.
Nous avons vu que les &quot;variables normales&quot;, aussi nomm&eacute;es variables scalaires,
commencent par un signe dollar ($). Les tableaux commencent par un signe @ m&ecirc;me si les donn&eacute;es
d'un tableau sont compos&eacute;es de plusieurs variables scalaires.
Vous devez donc &eacute;crire un signe dollar lorsque vous faites r&eacute;f&eacute;rence &agrave; un champ du tableau.
Regardons un exemple:
<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
!/usr/bin/perl -w
<br># vim: set sw=8 ts=8 si et:
<br># on d&eacute;clare un nouveau tableau:
<br>my @myarray;
<br># on l'initialise avec quelques donn&eacute;es:
<br>@myarray=(&quot;data1&quot;,&quot;data2&quot;,&quot;data3&quot;);
<br># on acc&egrave;de au premier &eacute;l&eacute;ment (indice 0):
<br>print &quot;Le premier &eacute;l&eacute;ment de myarray est: $myarray[0]\n&quot;;
</TD>
</TR>
</TABLE></CENTER>

Vous remarquerez que nous &eacute;crivons @myarray lorsque nous nous r&eacute;f&eacute;rons &agrave; l'ensemble
et $myarray[0] lorsque nous faisons r&eacute;f&eacute;rence &agrave; un &eacute;l&eacute;ment.
Les tableaux dans Perl commencent &agrave; l'indice 0. De nouveaux indices sont automatiquement
cr&eacute;es d&egrave;s que vous ajoutez des donn&eacute;es. Au moment de la d&eacute;claration du tableau, vous n'avez pas
besoin de conna&icirc;tre sa taille. Comme vous le voyez ci-dessus, vous pouvez
initialiser un tableau avec des donn&eacute;es en listant celles-ci s&eacute;par&eacute;es par des points virgules et entre
parenth&egrave;ses.<br>
(&quot;data1&quot;,&quot;data2&quot;,&quot;data3&quot;)
<br>est un tableau anonyme. Par cons&eacute;quent vous pouvez &eacute;crire
(&quot;data1&quot;,&quot;data2&quot;,&quot;data3&quot;)[1]
<br>pour obtenir le deuxi&egrave;me &eacute;l&eacute;ment de ce tableau:
<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
!/usr/bin/perl -w
<br>print "Le deuxi&egrave;me &eacute;l&eacute;ment est:"
<br>print (&quot;data1&quot;,&quot;data2&quot;,&quot;data3&quot;)[1];
<br>print "\n"
</TD>
</TR>
</TABLE></CENTER>

<A NAME="lfindex1">&nbsp;</A>
<H2>Boucles sur les tableaux</H2>

La boucle foreach dans Perl, permet l'it&eacute;ration de tous les &eacute;l&eacute;ments d'un tableau.
Elle fonctionne ainsi:
<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
#!/usr/bin/perl -w
<br># vim: set sw=8 ts=8 si et:
<br>my @myarray =(&quot;data1&quot;,&quot;data2&quot;,&quot;data3&quot;);
<br>my $lvar;
<br>my $i=0;
<br>foreach $lvar (@myarray){
<br>&nbsp;&nbsp;&nbsp;print &quot;le num&eacute;ro de l'&eacute;l&eacute;ment $i est $lvar\n&quot;;
<br>&nbsp;&nbsp;&nbsp;$i++;
<br>}
</TD>
</TR>
</TABLE></CENTER>
Ex&eacute;cuter ce programme nous donne:
<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
l'&eacute;l&eacute;ment num&eacute;ro 0 est data1
<br>l'&eacute;l&eacute;ment num&eacute;ro 1 est data2
<br>l'&eacute;l&eacute;ment num&eacute;ro 2 est data3
</TD>
</TR>
</TABLE></CENTER>
Foreach extrait chaque &eacute;l&eacute;ment du tableau et l'int&egrave;gre dans la variable de la boucle
($lvar dans l'exemple ci-dessus). Il est important
de remarquer que les valeurs ne sont pas copi&eacute;es du tableau dans la variable de la boucle.
Au contraire, la variable de la boucle est une sorte de pointeur et le fait de la modifier
modifie les &eacute;l&eacute;ments du tableau.
Le programme suivant transforme tous les &eacute;l&eacute;ments du tableau en majuscules.
Dans perl <tt>tr/a-z/A-Z/</tt> est &eacute;quivalent &agrave; la commande unix &quot;tr&quot;.
Dans ce cas, il transforme toutes les lettres en majuscules.
<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
#!/usr/bin/perl -w
<br># vim: set sw=8 ts=8 si et:
<br>my @myarray =(&quot;data1&quot;,&quot;data2&quot;,&quot;data3&quot;);
<br>my $lvar;
<br>print &quot;before:\n&quot;;
<br>foreach $lvar (@myarray){
<br>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;$lvar\n&quot;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;$lvar=~tr/a-z/A-Z/;
<br>}
<br>print &quot;\nafter:\n&quot;;
<br>foreach $lvar (@myarray){
<br>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;$lvar\n&quot;;
<br>}
</TD>
</TR>
</TABLE></CENTER>
Lorsque vous lancez le programme vous constatez que @myarray ne contient plus
que des majuscules dans la seconde boucle:

<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
<pre>
avant:
data1
data2
data3

apr&egrave;s:
DATA1
DATA2
DATA3
</pre>
</TD>
</TR>
</TABLE></CENTER>

<A NAME="lfindex2">&nbsp;</A>
<H2>La ligne de commande</H2>

Dans Perl II nous avons vu qu'une fonction &getopt peut &ecirc;tre utilis&eacute;e
pour lire la ligne de commande et toutes ses options.
&getopt est comme son &eacute;quivalent en C. C'est une fonction de biblioth&egrave;que.
Les valeurs de la ligne de commande dans Perl sont affect&eacute;es &agrave; un tableau nomm&eacute; @ARGV.
&getopt r&eacute;cup&egrave;re cet  @ARGV et en &eacute;value les &eacute;l&eacute;ments.
<br>
Au contraire du C, le contenu du premier &eacute;l&eacute;ment du tableau n'est pas le nom du programme
mais le premier argument de la ligne de commande. Si vous voulez conna&icirc;tre le nom du
programme Perl, vous devez lire $0 mais ce n'est pas le sujet de cet article.
Voici un programme exemple nomm&eacute; <a href="../../common/src/article136/add.txt">addition</a>.
Il r&eacute;cup&egrave;re deux nombres de la ligne de commande et les additionne:

<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
&gt; add 42 2
<br>42 + 2 is:44
</TD>
</TR>
</TABLE></CENTER>

.... et voici le programme:
<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
#!/usr/bin/perl -w
<br># v&eacute;rifier que nous avons 2 arguments:
<br>die &quot;USAGE: add number1 number2\n&quot; unless ($ARGV[1]);
<br>print &quot;$ARGV[0] + $ARGV[1] is:&quot;, $ARGV[0] + $ARGV[1] ,&quot;\n&quot;;
</TD>
</TR>
</TABLE></CENTER>


<A NAME="lfindex3">&nbsp;</A>
<H2>Une pile</H2>

Perl poss&egrave;de certaines fonctions internes qui utilisent un tableau de variables comme pile.
<ul>
<li> push ajoute un &eacute;l&eacute;ment &agrave; la fin du tableau
<li> pop lit un &eacute;l&eacute;ment &agrave; la fin du tableau
<li> shift lit un &eacute;l&eacute;ment au d&eacute;but du tableau
<li> unshift ajoute un &eacute;l&eacute;ment au d&eacute;but du tableau
</ul>
Le <A href="../../common/src/article136/array3.txt">programme suivant</a> ajoute deux &eacute;l&eacute;ments &agrave; un tableau existant:

<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
#!/usr/bin/perl -w
<br>my @myarray =(&quot;data1&quot;,&quot;data2&quot;,&quot;data3&quot;);
<br>my $lvar;
<br>print &quot;the array:\n&quot;;
<br>foreach $lvar (@myarray){
<br>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;$lvar\n&quot;;
<br>}
<br>push(@myarray,&quot;a&quot;);
<br>push(@myarray,&quot;b&quot;);
<br>print &quot;\nafter adding \&quot;a\&quot; and \&quot;b\&quot;:\n&quot;;
<br>while (@myarray){
<br>&nbsp;&nbsp;&nbsp;&nbsp;print pop(@myarray),&quot;\n&quot;;
<br>}
</TD>
</TR>
</TABLE></CENTER>
Pop supprime les &eacute;l&eacute;ments &agrave; la fin du tableau et la boucle while se poursuit jusqu'&agrave;
ce que le tableau soit vide.

<A NAME="lfindex4">&nbsp;</A>
<H2>Lire des r&eacute;pertoires</H2>

Perl offre les fonctions opendir, readdir et closedir pour lire le contenu
d'un r&eacute;pertoire. readdir renvoie un tableau contenant tous les noms de fichier.
En utilisant une boucle foreach vous pouvez parcourir tous les noms de fichier
et rechercher un nom donn&eacute;. Voici un <a href="../../common/src/article136/search_in_curr_dir.txt">simple programme</a>
qui recherche un nom de fichier donn&eacute; dans le r&eacute;pertoire courant:
<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
#!/usr/bin/perl -w
<br># vim: set sw=8 ts=8 si et:
<br>die &quot;Usage: search_in_curr_dir filename\n&quot; unless($ARGV[0]);
<br>opendir(DIRHANDLE,&quot;.&quot;)||die &quot;ERROR: impossible de lire le r&eacute;pertoire courant\n&quot;;
<br>foreach (readdir(DIRHANDLE)){
<br>&nbsp;&nbsp;&nbsp;&nbsp;print&quot;\n&quot;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;found $_\n&quot; if (/$ARGV[0]/io);
<br>}
<br>closedir DIRHANDLE;
</TD>
</TR>
</TABLE></CENTER>
Regardons le programme. D'abord nous v&eacute;rifions que l'utilisateur a fourni
un argument &agrave; la ligne de commande. Dans la n&eacute;gative nous affichons un
message d'utilisation et quittons le programme.
Ensuite nous ouvrons le r&eacute;pertoire courant (&quot;.&quot;). opendir est
&eacute;quivalent aux <tt>fonctions d'ouverture</tt> des fichiers. Le premier argument
est un handle que vous devez passer aux fonctions readdir et closedir.
Le deuxi&egrave;me argument est le chemin du r&eacute;pertoire.
<br>
Vient ensuite la boucle foreach. La premi&egrave;re chose int&eacute;ressante est que
la variable de la boucle est manquante. Dans ce cas Perl fait de la magie
en cr&eacute;ant pour vous une variable nomm&eacute;e $_ qui est alors utilis&eacute;e comme variable
de la boucle.
readdir(DIRHANDLE) renvoie un tableau et nous utilisons foreach pour voir chaque &eacute;l&eacute;ment.
/$ARGV[0]/io compare les <a href="../July1998/article53.html">expressions r&eacute;guli&egrave;res</a> contenues dans $ARGV[0]
par rapport &agrave; la variable $_.
io signifie que la recherche ne tient pas compte de la casse et compile une seule
fois les expressions r&eacute;guli&egrave;res.
La derni&egrave;re chose est une optimisation acc&eacute;l&eacute;rant le programme.
Vous pouvez l'utiliser si vous avez une variable dans une expression r&eacute;guli&egrave;re
et si vous &ecirc;tes certains qu'elle ne changera pas &agrave; l'ex&eacute;cution.
<br>
Essayons. En supposant que nous ayons les fichiers article.html, array1.txt
et array2.txt dans le r&eacute;pertoire courant, si nous cherchons &quot;HTML&quot;
le programme affichera:
<pre>
&gt;search_in_curr_dir HTML
.
..
article.html
found article.html
array1.txt
array2.txt
</pre>
Comme vous le voyez, la fonction readdir a trouv&eacute; 2 fichiers suppl&eacute;mentaires.
&quot;.&quot; et &quot;..&quot;. Ce sont les noms du r&eacute;pertoire courant et
du pr&eacute;c&eacute;dent.

<A NAME="lfindex5">&nbsp;</A>
<H2>Un outil pour la recherche de fichier</H2>

J'aimerais terminer cet article sur un programme plus complexe et utile.
Il est cens&eacute; &ecirc;tre un programme de recherche de fichier. Nous l'appelons pff
(perl file finder). Il fonctionne pratiquement comme le programme ci-dessus
mais recherche &eacute;galement les sous-r&eacute;pertoires.
Comment pouvons-nous cr&eacute;er un tel programme? Plus haut, nous avons du code
qui lit le r&eacute;pertoire courant et y recherche des fichiers. Nous devons
commencer par le r&eacute;pertoire courant mais si l'un des fichiers (sauf . et ..)
est un autre r&eacute;pertoire nous devons &eacute;galement y faire une recherche.
C'est un algorithme r&eacute;cursif type:
<pre>
sub search_file_in_dir(){
&nbsp;&nbsp;my $dir=shift;
&nbsp;&nbsp;...lit le r&eacute;pertoire $dir ....
&nbsp;&nbsp;...si un fichier est un autre r&eacute;pertoire
&nbsp;&nbsp;&nbsp;&nbsp;alors on appelle &search_file_in_dir(ce fichier)....
}
</pre>
Dans Perl vous pouvez v&eacute;rifier qu'un fichier est bien un r&eacute;pertoire et non un lien symbolique en utilisant
<tt>if (-d &quot;$file&quot; && ! -l &quot;$dir/$_&quot;){....}</tt>.
<br>Nous avons maintenant toutes les fonctionnalit&eacute;s requises et nous pouvons &eacute;crire
<a href="../../common/src/article136/pff.gz">le code (pff.gz)</a>.

<CENTER><TABLE BORDER=0 WIDTH="70%" BGCOLOR="#99B8F6" >
<TR>
<TD>
#!/usr/bin/perl -w
<br># vim: set sw=8 ts=8 si et:
<br># written by: guido socher, copyright: GPL
<br>#
<br>&help unless($ARGV[0]);
<br>&help if ($ARGV[0] eq &quot;-h&quot;);
<br>
<br># commence dans le r&eacute;pertoire courant:
<br>search_file_in_dir(&quot;.&quot;);
<br>#-----------------------
<br>sub help{
<br>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;pff -- perl regexp file finder
<br>USAGE: pff [-h] regexp
<br>
<br>pff recherche dans le r&eacute;pertoire courant et ses sous-r&eacute;pertoires
<br>des fichiers correspondants &agrave; une expression r&eacute;guli&egrave;re donn&eacute;e.
<br>La recherche ne tient jamais compte de la casse.
<br>
<br>EXEMPLE:
<br> recherche d'un fichier contenant la cha&icirc;ne foo:
<br>&nbsp;&nbsp;&nbsp;&nbsp;pff foo
<br> recherche d'un fichier se terminant par .html:
<br>&nbsp;&nbsp;&nbsp;&nbsp;pff \'\\.html\'
<br> recherche d'un fichier commen&ccedil;ant par la lettre \&quot;a\&quot;:
<br>&nbsp;&nbsp;&nbsp;&nbsp;pff \'^a\'
<br> recherche d'un fichier contenant le nom article<qqchose>html:
<br>&nbsp;&nbsp;&nbsp;&nbsp;pff \'article.*html\'
<br>&nbsp;&nbsp;&nbsp;&nbsp;remarquez le .* au lieu de seulement *
<br>\n&quot;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
<br>}
<br>#-----------------------
<br>sub search_file_in_dir(){
<br>&nbsp;&nbsp;&nbsp;&nbsp;my $dir=shift;
<br>&nbsp;&nbsp;&nbsp;&nbsp;my @flist;
<br>&nbsp;&nbsp;&nbsp;&nbsp;if (opendir(DIRH,&quot;$dir&quot;)){
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@flist=readdir(DIRH);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closedir DIRH;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (@flist){
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ignorer . et .. :
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next if ($_ eq &quot;.&quot; || $_ eq &quot;..&quot;);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (/$ARGV[0]/io){
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;$dir/$_\n&quot;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search_file_in_dir(&quot;$dir/$_&quot;) if (-d &quot;$dir/$_&quot; && ! -l &quot;$dir/$_&quot;);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
<br>&nbsp;&nbsp;&nbsp;&nbsp;}else{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;ERROR: impossible de lire le r&eacute;pertoire $dir\n&quot;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;}
<br>}
<br>#-----------------------
</TD>
</TR>
</TABLE></CENTER>

Regardons un peu le programme. Nous v&eacute;rifions d'abord que l'utilisateur
a fourni un argument &agrave; la ligne de commande. Si c'est non, c'est une erreur
et nous affichons un petit texte d'aide. Nous affichons aussi un texte d'aide
si l'option -h est donn&eacute;e.
Autrement, nous commen&ccedil;ons la recherche dans le r&eacute;pertoire courant. Nous
utilisons l'algorithme r&eacute;cursif comme d&eacute;crit plus haut.
Nous lisons le r&eacute;pertoire, recherchons les fichiers, v&eacute;rifions si un fichier est un
r&eacute;pertoire, si oui nous rappelons search_file_in_dir().
<br>
<br>
Dans la partie o&ugrave; nous v&eacute;rifions s'il s'agit de r&eacute;pertoires nous v&eacute;rifions
aussi qu'il ne s'agit pas d'un lien vers un r&eacute;pertoire. Nous devons le faire
parce que quelqu'un peut avoir cr&eacute;e un lien symbolique vers &quot;..&quot;.
Un tel lien forcerait le programme &agrave; s'ex&eacute;cuter ind&eacute;finiment si nous ne
faisions pas cette v&eacute;rification.
<br>
<br>
Nous n'avons pas encore parl&eacute; du <tt>next if ($_ eq &quot;.&quot; || $_ eq &quot;..&quot;); </tt>.
L'op&eacute;rateur &quot;eq&quot; est l'op&eacute;rateur de comparaison de cha&icirc;ne de Perl. Ici, nous
testons si le contenu de la variable $_ est &eacute;quivalent &agrave; &quot;..&quot; ou &quot;.&quot;.
S'il est &eacute;quivalent alors &quot;next&quot; est ex&eacute;cut&eacute;. &quot;next&quot;dans une boucle foreach
signifie red&eacute;marrer au d&eacute;but de la boucle avec l'&eacute;l&eacute;ment suivant du tableau.
Il est similaire au &quot;continue&quot; du C.

<A NAME="lfindex6">&nbsp;</A>
<H2> R&eacute;f&eacute;rences </H2>

Voici une liste d'autres int&eacute;ressants tutoriels perl
<ul>
<li><a href="http://fpg.uwaterloo.ca/perl/">fpg.uwaterloo.ca/perl/</a>
<li><a href="http://www.programmingtutorials.com/">www.programmingtutorials.com</a>
<li><a href="http://www.ncsa.uiuc.edu/General/Training/PerlIntro/">www.ncsa.uiuc.edu/General/Training/PerlIntro</a>
<li><a href="http://www.geocities.com/SiliconValley/Orchard/2320/perl.html">www.geocities.com/SiliconValley/Orchard/2320/perl.html</a>
</ul>




<!-- vim: set sw=2 ts=2 et: -->

<!-- 2pdaIgnoreStart -->
<A NAME="talkback">&nbsp;</a>
<h2>Discussion sur cet article</h2>
Chaque article poss&egrave;de sa page de discussion. Vous pouvez y soumettre un commentaire ou lire ceux d&acute;autres lecteurs:
<center>
<table border="0"  CELLSPACING="2" CELLPADDING="1">
 <tr BGCOLOR="#C2C2C2"><td align=center>
  <table border="3"  CELLSPACING="2" CELLPADDING="1">
   <tr BGCOLOR="#C2C2C2"><td align=center>
    <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=136&lang=fr"><b>&nbsp;page de discussion&nbsp;</b></a>
   </td></tr></table>
</td></tr></table>
</center>

<HR size="2" noshade>
<!-- ARTICLE FOOT -->
<CENTER><TABLE WIDTH="95%">
<TR><TD ALIGN=CENTER BGCOLOR="#9999AA">
<A HREF="../../common/lfteam.html">Site Web maintenu par l&acute;&eacute;quipe d&acute;&eacute;dition LinuxFocus</A>
<BR><FONT COLOR="#FFFFFF">&copy; Guido Socher, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT>
<BR><a href="http://cgi.linuxfocus.org/cgi-bin/lfcomment?lang=fr&article=article136.shtml" target="_TOP">Cliquez ici pour signaler une erreur ou envoyer un commentaire à Linuxfocus</A><BR></TD>
<TD BGCOLOR="#9999AA"><!-- TRANSLATION INFO -->
<font size=2>Translation information:</font><TABLE>
<tr><td><font size=2>en</font></td>
    <td><font size=2>-&gt;</font></td>
    <td><font size=2>--</font></td>
    <td><font size=2><a href="mailto:guido.socher@linuxfocus.org"><FONT COLOR="#FFFFFF">Guido Socher</FONT></a></font></td>
</tr>
<tr><td><font size=2>en</font></td>
    <td><font size=2>-&gt;</font></td>
    <td><font size=2>fr</font></td>
    <td><font size=2><a href="mailto:gete@wanadoo.fr"><FONT COLOR="#FFFFFF">Georges Tarbouriech</FONT></a></font></td>
</tr>
</TABLE></TD>
</TR></TABLE></CENTER>
<p><font size=1>2001-03-18, generated by lfparser version 2.8</font></p>
<!-- 2pdaIgnoreStop -->
</BODY>
</HTML>