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 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:
- Recherche:
$texte =~ m/PATTERN/[g][i][m]
- Remplacement:
$texte =~ s/PATTERN/REPLACEMENT/[e][g][i][m][s]
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.
- $texte est le texte sur lequel porte la recherche ou le remplacement
- PATTERN est une expression régulière dont on reparle juste après
- REPLACEMENT est la chaine de remplacement
- les termes entre crochets sont des paramètres optionnels:
g la recherche ou le remplacement est répêté autant de fois que possible i le respect de la casse (majuscule/minuscule) est pris en compte m la chaine est interprêtée sur plusieurs lignes s la chaine ne représente qu'une ligne seule e la chaine de remplacement est évaluée comme une expression PERL
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
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:password->nom=code
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);
- @dir est la liste des fichiers et répertoires contenus dans le chemin précisé
Lecture d'un fichier dans un tableau de lignes
open (filehandle,"<$filename");
my @lignes=<filehandle>;
close (filehandle);
@lignes
est la liste des lignes du fichier précisé
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);
- @lignes est enregistré dans le fichier précisé
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 la documentation au format WORD |