Les Expréssions Rationnelles



Une expression rationnelle est une manière de décrire une chaine de caractères, un modele, sans énumérer tout les caractère qui là compose .

On peut s'en sérvir de plusieurs façon :

L'usage le plus simple des expressions rationnelles est la recherche d'une expression litérale par exemple la recherche dans une page .html de tous les liens vers l'exterieur (http: et ftp:):

  foreach $ligne(@contenu) {
    if  ($ligne =~ /http:|ftp:/) {
      print $ligne;
      }
    }
  
ou implicitement:
  while (<>) {
    print if /http:/;
    print if /ftp:/;
    print if /mailto:/;
    }
  

ensuite la substitution avec s/// ou tr qui est un outils too much pour modifier des fichiers quelqu'ils soient.
exemple:
 Vous avez un trouvez un fichier sur le net qui énumére des adresses ou n'importe quoi d'autres que vous aimeriez bien vous servir pour votre base de données perso seulement il est au format HTML (des balises partout) , style:

  <TD>abo.wanadoo.fr</TD>
  <TD>876</TD>
  </TR>
  <TR>
  <TD>salieri.img.fr</TD>
  <TD>228</TD>
  
etc...     mais c'est pas grave il y a perl.
Vous souhaitez otenir deux fichiers, l'un au format texte avec le nom du domaine et dessous le nombre qui lui est attribué, l'autre un fichier (.cvs) tableau avec element séparés par des virgules, rien de plus facile.
Voici trois exemples:


#!/usr/bin/perl -w
# remd: preparation de liste. adelmar alain

$listea = "lbldom.txt";       # on place les fichiers dans des variables (pas obligé bonne habitudes)
$listeb = "lslblserv.html";

open LSA, $listeaor die "Error: pbOpSrc $!";    # on ouvre le fichier source en lecture.
@contenu = <LSA>;                                           # on glisse le contenu à la variable liste @contenu.
close LSA or die "Error pbShutSrc $!";              #on ferme ou on previent

@nwcontenu =<LSB>;               # on prevoit de définir une variable liste pour le résultat.

# pour chaque ligne du contenu {BLOC d'instruction}
foreach $ligne (@contenu) {
     next if length$ligne <= 6     # ote les lignes de 7 caractres au plus.
     $s1 = $ligne;                        # facultatif, place la ligne dans une nouvelle var.
     $s1 =~s/<TD.//;                    # substitue le tag de debut de ligne.
 push @contenu_moins_tagin, $s1; # pousse le contenu dans nlle liste.
}

# on prend le resultat et on recommence avec les tag de fin de ligne.
foreach $s1 (@contenu_moins_tagin) {
 $s2 = $s1;
 $s2 =~ s/()<.?TD.?//;
 print "Je traite la ligne: $s2\n"; # facultatif mais joli
 push @nwcontenu, $s2;
}

# On ouvre le fichier de sortie et on ecrit la liste dessus.
open(LSB, ">$listeb") or die "Error pbOpenCible $!";
print LSB @nwcontenu;
close LSB or die "Error pbShutCible $!";
END;

Les couleurs sont à peu prés celles de gvim lorsqu'il traite du perl (bonnard non?), bon ceci n'est qu'un exemple et en plus pas trés beau, mais ça marche (c'est le premier que j'ai fais pour me faire la main) .
On peut aussi faire plus propre en paufinant (c'est le même mais ne comprend qu'une boucle foreach):

#!/usr/bin/perl -w
# remd: preparation de liste. adelmar alain

$listea = "lbldom.txt";       # on place les fichiers dans des variables (pas obligé bonne habitudes)
$listeb = "lslblserv.html";

open LSA, $listeaor die "Error: pbOpSrc $!";    # on ouvre le fichier source en lecture.
@contenu = <LSA>;                                           # on glisse le contenu à la variable liste @contenu.
close LSA or die "Error pbShutSrc $!";              #on ferme ou on previent

@tagot = <