Cours Perl

Expressions rationnelles

L'expression rationnelle est un modèle à comparer avec une chaîne de caractères (pattern matching). Utile pour la recherche, la modification et l'extraction.

Syntaxe d'une expression rationnelle : /expression/

Deux opérateurs :
=~ recherche d'une correspondance de l'expression à droite sur le paramètre de gauche ;
!~ négation de =~
. tout caractère (sauf le \n)
[...] chercher un des caractères entre crochets
[^...] tout caractère qui n'est pas dans les crochets
\n \r \f \t nouvelle ligne, retour chariot, saut de page, tabulation
\w caractères alphanumériques (A..Z, a..z, 0..9)
\W tout sauf des caractères alphanumériques
\s espace
\S pas d'espace
\A début de la chaine
\Z fin de la chaine
\d chiffre (0..9)
\D tout sauf un chiffre (0..9)
^e la ligne (ou la chaine) commence par le caractère e
e$ la ligne (ou la chaine) finit par le caractère e
e+ une ou plusieurs occurrences de e
e* zéro ou plusieurs occurrences de e
e? zéro ou une occurrence de e
e{n} n instances de e
e{n,} au moins n occurrences de e
e{n,p} au moins n occurrences de e et au plus p
| alternative
Pour obtenir les caractères spéciaux :
+ ? . * ^ $ ( ) [ ] { } | \
il faut les faire précéder de \

Recherche sans modification

Syntaxe m/expression/options
Options g : toutes les occurrences ;
i : ne pas tenir compte de la casse.

Voici un script qui vérifie les adresses mail passées en paramètre :

#!/usr/bin/perl

foreach $param (@ARGV){
   if($param =~ m/[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)/){
       print "$param\n";
   }
   else{
   	   print "mauvaise adresse\n";
   }
}
_________________________________________
adresse.pl mac@lim.univ-mrs.fr bidule@truc
mac@lim.univ-mrs.fr
mauvaise adresse
_________________________________________
Pour un fichier contenant les noms : INXS, Jackson, Nirvana, Police, Sting, Supertramp le script ci-dessous n'affichera pas INXS et Nirvana.
!/usr/bin/perl
print "entrez un nom de fichier : ";
$fichier = <STDIN>;
chomp($fichier);
open(F, $fichier) || die "Problème à l\'ouverture : $!";
while($ligne = <F>)
{
    if($ligne !~ m/N/){
        print $ligne;
    }
}
_________________________________________
entrez un nom de fichier : chanteurs.txt
Jackson
Police
Sting
Supertramp
__________________________________________

Recherche avec modification

Syntaxe s/expression/remplacement/options
Options g : toutes les occurrences ;
i : ne pas tenir compte de la casse.

Le script ci-dessous affichera poules ou chevaux si le mot entré était poule ou cheval (le mot entré est modifié dans la variable nom).

#!/usr/bin/perl
print "entrez un nom d'animal : ";
$nom = <STDIN>;
chomp($nom);
$nom =~ s/al$/aux/;
$nom =~ s/e$/es/;
print "pluriel : $nom\n";
________________________________
entrez un nom d'animal : cheval
pluriel : chevaux
________________________________
Voici un script qui donne le nombre d'occurrences remplacées, essayez le avec la phrase ci-dessous :
J'aime Internet explorer et j'utilise souvent internet Explorer pour lire des pages web.
#!/usr/bin/perl
print "entrez une phrase : ";
$phrase = <STDIN>;
$nb = ($phrase =~ s/Internet Explorer/Netscape/gi);
print "\n\n$phrase\n";
print "nombre d'occurrences remplacees : $nb\n";
__________________________________________________________
entrez une phrase : J'aime Internet explorer et j'utilise 
souvent internet Explorer pour lire des pages web

J'aime Netscape et j'utilise souvent Netscape pour lire 
des pages web

nombre d'occurrences remplacees : 2
___________________________________________________________

Translation

Syntaxe tr/expression/remplacement/

Le script ci-dessous lit les caractères minuscules et les transforme en majuscules :

#!/usr/bin/perl
print "entrez une phrase : ";
$phrase = <STDIN>;
$phrase =~ tr/[a-z]/[A-Z]/;
print "\n$phrase\n";
__________________________________
entrez une phrase : phrase de test        

PHRASE DE TEST
__________________________________