Concepts du langage PERL

Perl fait partie de la famille de plus en plus grande des langages à script qui se développent autour du WEB. Cependant, il diffère assez sensiblement de JavaScript ou Php qui s'exécutent en "temps réel" lors de la consultation d'un site. En effet, Perl peut être utilisé dans de tout autres contextes, mais en contre-partie il s'intègre moins efficacement aux pages web. A mon sens, il devrait donc être utilisé en complémentarité avec Php et servir à la manipulation off-line des pages du site.

Si comme je le mentionne plus haut, PERL se destine à de très diverses applications, gardons à l'esprit que le WEB permet l'exécution à distance des scripts. Encore faut-il, pour cela, que ceux-ci aient été rendus exécutables par une commande du style:

 chmod +x /nom fichier.pl

et que, bien sûr, un interprêteur PERL se trouve installé sur le serveur!!

Télécharger télécharger l'interprêteur PERL sous Win32

Vous trouverez ci-dessous une présentation simplifiée des principales fonctionnalités de PERL suivie d'une documentation plus complète à télécharger (au format WORD, tirée de pages HTML).

Description succinte du langage

Tout d'abord, un script PERL doit débuter par une ligne ressemblant à cela:

 #!/bin/perl

Elle indique le chemin où trouver l'interprêteur (dans le cas où il ne se trouverai pas dans le même dossier que le script)

Une fois, cette formalité accomplie, le script proprement dit apparaît.

Au niveau de la syntaxe, il faut savoir que les instructions sont séparées par des ; comme en C et que les commentaires sont délimités par le symbole # et la fin de la ligne. Les blocs d'instruction sont délimitées par des accolades et il faut noter qu'après une directive de contrôle de flux (if, while...) les instructions à exécuter doivent impérativement être placées entre accolades, même s'il n'y en a qu'une seule.

Puisqu'il s'agit d'un langage de script, il n'est en général pas nécessaire de déclarer les variables. Cependant, l'utilisation de variable locales doit être précisée à l'aide du mot clé my. Ensuite, il faut savoir que les fonctions sont déclarées à l'aide du mot clé sub et que le type et le nombre de ses arguments n'apparaîssent pas dans la déclaration. En fait, le premier argument est noté @_[0], le deuxième sera noté @_[1] etc. Le résultat d'une fonction est renvoyé par la directive return.

Pour vous familiariser avec toutes ces notions de base, voici l'exemple d'une fonction qui additionne les deux éléments qu'elle reçoit:

sub addition
{
my $variable1=@_[0];
my $variable2=@_[1];

 return $variable1+$variable2;

Vous avez sans doute remarqué la présence du symbole $ devant le nom des variables. En fait, la plupart des variables se soumettent à cette syntaxe. Cependant, les listes ou tableaux sont précédés du symbole @ et les tables de hachage sont précédés de %.

Manipulation des données

TEST D'ENTIERS
Test d'égalité ($nombre1 == $nombre2)
Test de non égalité ($nombre1 != $nombre2)
 
CHAINES DE CARACTERES
Initialisation $res="une chaine"
Concaténation $res=$chaine1.$chaine2
Division d'une chaine @tab=split($separateur,$chaine)
Test d'égalité ($chaine1 eq $chaine2)
Test de non égalité ($chaine1 neq $chaine2)
   
TABLES
Initialisation @table=(elt1, elt2, ...)
Accès à une ligne $lig=$table[$ligne]
Ajout d'une entrée push @table, $ligne
   
HASH-TABLES
Initialisation %hash=(key1=>val1, ...)
Tester l'existence d'une clé exists $hash{$key}
Lecture d'une clé $val=$hash{$key}
Ajout d'une clé $hash{$key}=$val
Supprimer une clé delete $hash{$key}
Lire la liste des clés @cles=keys %hash

Accès séquentiel aux lignes d'une table

for ($i=0; $i<@table;$i++)
{
 $ligne=$table[$i];
 ...
}

ou

foreach $ligne (@table)
{
 ...
}

Expressions régulières

Il s'agit de la grande force du langage. En effet, la manipulation des données est souvent synonyme de parsing et là PERL excelle. Voyons tout d'abord les fonctions qui permettent de rechercher et de remplacer des expressions:

L'expression ci-dessus pour la recherche est en fait un type booléen, ce qui fait qu'elle peut et doit être placée comme condition de if, while... Pour le remplacement, le résultat est un entier correspondant au nombre de substitutions effectuées, il n'est bien sur pas nécessaire de l'utiliser.

Voici enfin le moment tant attendu de décrire ces expressions régulières

Tous les caractères codent pour eux-même sauf: + ? . * ^ $ ( ) [ ] { }| \>

La signification particulière de ces caractères être ignorée s'ils sont précédés de \

ELEMENTS DE BASE
. un caractère quelconque sauf le saut ligne en mode multi-lignes
(...) regroupe une sous expression régulière (voir ci-dessous l'utilité)
^ début de ligne
$ fin de ligne
[^...] non logique
(...|...|...) ou logique
(?# TEXT) commentaire
   
QUANTIFICATEURS OPERANT SUR L'ELEMENT LES PRECEDENT
+ une fois ou plus
? zéro ou une fois
* zéro, une ou plusieurs fois
{N, M} au moins N fois, au plus M fois
   
CARACTERES SPECIAUX
\n \r \f \t sens habituel
\w caractère alphanumérique (inclus _)
\d chiffre
\s espace
  Un non logique sur ces symboles est
réalisé en les écrivant en majuscule
   
AUTO REFERENCES
\1...\9 réfèrent à la n-ième parenthèse

Revenons sur l'utilité des parenthèses qui permettent d'identifier une sous-expression régulière. Le plus simple est, je pense, de considérer un exemple. Imaginons que $texte soit un fichier contenant la liste des mots de passe d'un certain nombre d'utilisateurs sous la forme password->nom=code Pour récupérer tous les noms et mots de passe associés dans la hash-table %password, la séquence suivante est appropriée:

while ($texte=~m/^password->(\w+)=([^$]+)/g)
{
%password{$1}=$2
}

L'expression régulière permet donc de rechercher un début de ligne suivie de password-> suivie d'un ou plusieurs caractère alphanumérique, de "=" et d'un ou plusieurs caractères qui ne soient pas la fin de la ligne.

Notez la présence du g qui permet de bien rechercher toutes les occurences, c'est à dire qu'à chaque exécution de $texte=~m/... la recherche se poursuit à partir du dernier emplacement. Sans l'option g celle-ci s'achèverait en renvoyant un false au while de sorte qu'une seule itération (au plus) de la boucle ne s'exécuterai.

L'utilité des parenthèses est, vous l'aurez compris, d'identifier les paramètres nom et code et de pouvoir ensuite les récupérer dans des variables. Si vous commencez à comprendre la philosophie de PERL vous en déduirez immédiatement que ces variables s'appellent respectivement $1 et $2. Remarquez également qu'il est possible d'utiliser ces variables dans la chaine REPLACEMENT.

Il est important de noter par ailleurs que l'expression régulière peut faire référence à ces variables qui s'appellent alors \1 et \2. C'est l'un des points cruciaux qui font de PERL un excellent outil d'analyse de texte.

Accès aux fichiers

Lire le contenu d'un dossier

opendir (dirhandle, $chemin);
@dir=readdir (dirhandle);
closedir (dirhandle);

Lecture d'un fichier dans un tableau de lignes

open (filehandle,"<$filename");
my @lignes=<filehandle>;
close (filehandle);

Ecriture d'un tableau de lignes dans un fichier

open (filehandle,">$filename");

for (my $i=0; $i<@lignes; $i++)
{
print $filehandle $lignes[$i]."\r\n";
}

close (filehandle);

Autres fonctions classiques

Manipulation de données

Accès séquentiel à une table foreach $var (@table) { ... }
Accès séquentiel à une hash-table foreach @key_value (%hash) {...}
Inverser une liste reverse @liste
Trier une liste sort @liste

Fonctions systèmes

Exécuter une expression PERL eval $expr
Créer un répertoire mkdir $dir
Supprimer un répertoire rmdir $dir
Renommer un fichier rename $old, $new
Afficher un message sur la ligne de commande print $message
Exécuter une commande en ligne system @liste
Exécuter une commande en ligne + exit exec @liste

Télécharger télécharger la documentation au format WORD