Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Expressions régulières
  3. Les expressions régulières en Perl
Extrait - Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition)
Extraits du livre
Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

Les expressions régulières en Perl

Généralités 

Perl est un langage de programmation qu’on peut appeler interprété par opposition aux langages compilés classiques, mais cette appellation est approximative car le fonctionnement de l’interpréteur n’est pas aussi simple et linéaire que dans le cas d’un interpréteur de commandes shell.

Il a été développé à partir de 1987 par Larry Wall, initialement dans le but d’administrer des machines UNIX. On retrouve d’ailleurs dans Perl des similitudes avec le langage C et avec des outils UNIX tels que le shell, sed, awk et tr.

Son nom est un acronyme des termes Pratical Extraction and Report Language. Le langage est en effet très polyvalent et peut être utilisé dans un très grand nombre d’applications, notamment pour le traitement de fichiers de données et la production de rapports ou de synthèses.

C’est un langage très utilisé car il est portable et présent dans de nombreux environnements. 

Au contraire de Python qui est très rigoureux, Perl autorise une syntaxe avec beaucoup moins de contraintes, et favorise une diversité de styles d’écriture.

Bien que ses racines puisent dans le monde UNIX, sa documentation est bien moins synthétique que ne l’étaient les pages de manuel des différentes versions d’UNIX....

Intégration des expressions régulières au langage 

1. Généralités 

La gestion des expressions régulières en Perl fait partie intégrante du langage, elle ne nécessite pas de fonctions bibliothèques ou de modules externes. Les recherches de chaînes correspondant à des expressions régulières, ou les substitutions de chaînes, ont une syntaxe native spécifique, différente d’un appel de fonction ou de méthode.

Comme pour le reste du langage, la syntaxe de recherche d’expressions régulières est souple et multiple.

Il existe toutefois des modules spécialisés utilisant des expressions régulières, pour traiter des besoins courants, comme par exemple Regexp::Common, disponible sur le site http://search.cpan.org.

2. Avertissement 

Le langage Perl possédant de très nombreuses fonctionnalités, nous ne pourrons dans cet ouvrage en aborder qu’un sous-ensemble restreint.

3. Recherche de chaînes 

La recherche de chaînes de caractères utilisant des expressions régulières possède son propre opérateur à une lettre : m/expression/, la lettre m étant l’initiale de match (correspondance, en anglais). Les slashes (/) sont inspirés de ceux que l’on trouve dans ed, ex, sed, vi, awk, ...

Cette syntaxe est suivie de façon facultative d’un ou plusieurs...

Les expressions régulières 

1. Utilisation du caractère . 

Le caractère . désigne un caractère quelconque, à l’exception du saut de ligne (newline). Si le flag s a été spécifié, le caractère . pourra également correspondre à un saut de ligne.

2. Utilisation du caractère \ 

Le caractère antislash sert à supprimer la signification particulière d’un métacaractère, ou à définir un caractère spécial. Les caractères spéciaux définis à l’aide de l’antislash sont les suivants :

\0

correspond au caractère ASCII nul.

\nnn

correspond au caractère spécifié en octal (\377 en octal vaut 255 en base 10).

\n

correspond à la n-ième chaîne sélectionnée avec des parenthèses.

\a

correspond au caractère ASCII bel.

\A

correspond uniquement au début de la chaîne.

\b

correspond à la chaîne vide, en début ou fin de mot.

\B

correspond à la chaîne vide, uniquement si elle n’est ni en début, ni en fin de mot.

\cX

correspond au caractère de contrôle Ctrl-X.

\d

correspond à un chiffre décimal, ou, si UNICODE est spécifié, correspond à ce qui est spécifié en tant que chiffre dans la base Unicode.

\D

correspond à tout sauf un chiffre décimal, ou, si UNICODE est spécifié, correspond à tout sauf ce qui est spécifié en tant que chiffre dans la base Unicode.

\e

correspond au caractère d’échappement ASCII ESC.

\E

termine une conversion de casse de caractères amorcée avec \L ou \U.

\f

correspond au caractère de saut de page (form feed).

\l

convertit le prochain caractère en minuscule.

\L

convertit en minuscules tous les caractères jusqu’au prochain \E.

\n

correspond à un saut de ligne.

\Q

supprime leur caractère spécial à tous les caractères jusqu’au prochain \E.

\r

correspond au retour chariot (carriage return).

\s

correspond à un caractère espace, \t, \n, \r, \f, \v.

\S

correspond à tout sauf les caractères espace, \t, \n, \r, \f, \v.

\t

correspond à une tabulation.

\u

convertit le prochain...

Les classes de caractères 

Les classes de caractères définies par POSIX, de syntaxe [:classe:], sont reconnues par le langage Perl. Voir le chapitre Les classes de caractères POSIX sur ce sujet pour une définition de ces classes.

Exemple de programme de recherche de correspondance 

Le programme search.pl ci-dessous contient un exemple de recherche de correspondance entre une chaîne et une expression régulière :

#!/usr/bin/perl -w 
 
use strict;  
 
my $prgm       = `basename $0`; 
chop($prgm);  
 
sub Main  
{  
    print "ARGC = $#ARGV\n";  
 
    if ($#ARGV != 1) {  
         print STDERR "Usage: $prgm regex string\n"; 
         exit(1);  
    }  
 
    my $regex      = $ARGV[0];  
    my $str        = $ARGV[1];  
 
    print "EXPRESSION = $regex\n";  
    print "CHAINE     = $str\n";  
 
    if ($str =~ m/$regex/) {  
         print "OK\n";  
    }  
    else {  
         print "KO\n";  
    }  
 
    exit(0);  
}  
 
Main(); 

Exemple de programme de substitution 

Le programme subst.pl ci-dessous contient un exemple de substitution de chaîne de caractères utilisant une expression régulière :

#!/usr/bin/perl -w  
 
use strict;  
 
my $compteur   = 0;  
my $prgm       = `basename $0`;  
chop($prgm);  
 
sub Main  
{  
    if ($#ARGV != 2) {  
         print STDERR "Usage: $prgm variable regex string\n"; 
         exit(1);  
    }  
 
    my $var        = $ARGV[0];  
    my $regex      = $ARGV[1];  
    my $str        = $ARGV[2];  
 
    print "VARIABLE      = \"$var\"\n";  
    print "EXPRESSION    = \"$regex\"\n";  
    print "CHAINE        = \"$str\"\n";  
 
    $var =~ s/$regex/$str/g;  
    print "RESULTAT      = \"$var\"\n";  
 
    exit(0);  
}  
 
Main();