Introduction à PERL

Transcription

Introduction à PERL
Département Informatique
Laboratoires de système d’exploitation
Introduction à
PERL
par Louis SWINNEN
Ce document est disponible sous licence Creative Commons indiquant qu’il peut être
reproduit, distribué et communiqué pour autant que le nom des auteurs reste présent,
qu’aucune utilisation commerciale ne soit faite à partir de celui-ci et que le document ne soit
ni modifié, ni transformé, ni adapté.
http://creativecommons.org/licenses/by-nc-nd/2.0/be/
La Haute Ecole Libre Mosane (HELMo) attache une grande importance au respect des droits d’auteur.
C’est la raison pour laquelle nous invitons les auteurs dont une œuvre aurait été, malgré tous nos
efforts, reproduite sans autorisation suffisante, à contacter immédiatement le service juridique de la
Haute Ecole afin de pouvoir régulariser la situation au mieux.
Septembre 2010
1. Introduction
PERL est un langage de script très répandu dans le monde Unix et très populaire auprès des
administrateurs systèmes et réseaux. À coté de PERL, on trouve également PYTHON, autre
langage de script, très répandu également.
PERL est un langage interprété. En effet, c’est le code source du langage qui est lu par
l’interpréteur et qui est exécuté. Il est, par conséquent, portable. PERL est également
proche de la syntaxe de C. Ainsi, les programmeurs C peuvent facilement comprendre et
écrire des programmes PERL. PERL est également un langage de haut niveau dans le
sens où de nombreuses fonctions existent pour aider le programmeur : ainsi la manipulation
de chaînes de caractères, l’accès (ouverture, lecture, écriture) aux fichiers, l’exécution de
commande du système est simplifié en PERL. Ce langage a été longtemps utilisé pour écrire
des scripts Web (appelé scripts CGI) avant la généralisation de PHP.
Enfin PERL est un logiciel libre qui est disponible gratuitement sur internet. Aujourd’hui, on
trouve des implémentations sous GNU/Linux mais également sur la plupart des systèmes
UNIX (comme MacOS X, *BSD, Oracle Solaris, …) mais également sous Windows.
L’étude de PERL pourrait nous occuper longtemps … le but de cette petite introduction est
d’ouvrir une porte, libre au lecteur de se plonger dans ce langage s’il le souhaite. Beaucoup
de sites internet parlent de PERL, ainsi citons :
• http://www.perl.org, le portail officiel
• http://perl.enstimac.fr/, traduction en français de la documentation
• http://www.perl.org/books/library.html, quelques livres de référence dont certains
sont disponibles gratuitement en ligne
• http://www.lea-linux.org/documentations/index.php/Dev-perl,
site
LEA-LINUX
fournissant beaucoup d’information sur Linux et, introduisant PERL.
2. Concepts
2.1 Pour commencer
Pour commencer la rédaction d’un programme PERL, il faut disposer de deux choses :
• un éditeur texte
• l’interpréteur PERL
La plupart des distributions Linux fournissent ces deux composants. Prenez donc votre
éditeur texte préféré (comme Vim par exemple) et commencez la rédaction de votre
programme.
On commence la rédaction d’un programme PERL par les deux lignes suivantes :
#! /usr/bin/perl
use strict;
Voici comment il faut comprendre ces deux lignes :
• La première ligne indique que le texte qui suit doit être lancé par l’interpréteur PERL.
Le chemin par défaut est /usr/bin/perl. Vérifiez bien où se trouve votre
interpréteur.
• La seconde ligne mentionne que nous utiliserons le mode strict. C'est-à-dire que le
programmeur a l’obligation de définir toutes les variables avant de les utiliser. Cette
option est largement recommandée afin d’éviter les erreurs de typographies.
2
2.2 Les variables
PERL permet l’utilisation de 3 familles de variables. En effet, il y a :
• les variables simple ou atomique
• les variables multivaluées ou tableaux
• les variables représentant des tables hachées
Toute variable doit être déclarée grâce au mot clé my.
2.2.1 Les variables simples
Une variable simple se reconnaît facilement car son nom est préfixé par le symbole $. Ainsi,
voici la définition de plusieurs variables simples :
my $val = 2;
my $texte;
$texte = "Hello World\n";
La première ligne définit une variable simple, nommée $val et contenant la valeur 2. Les
deux lignes suivantes définissent une variable simple, nommée $texte. Ensuite, on lui
affecte le texte Hello World suivi du retour à la ligne.
2.2.2 Les tableaux
PERL permet de définir facilement des tableaux. Ces tableaux sont toujours dynamiques (on
ne mentionne jamais leur taille). Une variable tableau se reconnaît car elle est préfixée par le
symbole @. Ainsi voici la déclaration de tableaux :
my @tab;
$tab[0] = 5;
$tab[$val] = 4;
On remarque que :
• comme en C, le tableau débute à l’indice 0.
• à l’inverse de C, une chaîne de caractère n’est pas un tableau mais une variable
simple.
• l’accès à un élément s’effectue comme l’accès à une variable simple, au moyen du
symbole $.
On peut connaître la taille d’un tableau grâce au mot clé scalar. Par exemple :
my $taille = (scalar @tab);
PERL permet d’avoir accès à tous les éléments d’un tableau en extension. Par exemple :
my $flatten_tab = (@tab);
La variable simple $flatten_tab contient tous les éléments présents dans le tableau
@tab.
2.2.3 Les tables hachées
La table hachée est un outil puissant. PERL la rend très flexible. Une donnée représentant
une table hachée est préfixée par le symbole %. La fonction de hachage, le rangement et les
collisions sont gérées automatiquement par PERL, le programmeur ne doit jamais s’en
soucier.
3
La clé utilisée pour accéder / stocker un élément peut être numérique ou textuelle. Cela
permet une réelle flexibilité. Exemple :
my %hash;
$hash{"cle"} = 2;
$hash{$val} = "hello";
On remarque que :
• comme pour les tableaux, l’accès à un élément de la table hachée (qui contient une
donnée simple) se fait au moyen du symbole $
• dans l’exemple, cle est la clé d’accès à la table tandis que $val est une variable
simple contenant la valeur de la clé d’accès.
PERL permet d’avoir accès à l’ensemble des clés définies sur une table hachée en extension :
$toutes_cles = (keys %hash);
Il est possible de savoir si une clé d’une table hachée est déjà définie :
if(defined $hash{$val}) { ...
Nous aborderons plus précisément les structures conditionnelles dans la suite.
2.2.4 Quelques variables particulières
PERL définit les variables suivantes :
• @ARGV, tableau contenant les paramètres passés par la ligne de commande au
programme.
• $_, variable simple désignant l’entrée par défaut, nous y reviendrons par la suite.
• $!, variable simple renseignant l’erreur survenue
• STDIN, flux désignant l’entrée standard (i.e. le clavier).
• STDOUT, flux désignant la sortie standard (i.e. l’écran).
• STDERR, flux désignant la sortie d’erreur (i.e. l’écran).
2.3 Quelques opérations courantes
2.3.1 Opérations sur les chaînes de caractères
Syntaxe
$c1.$c2
$c1 eq $c2
$c1 ne $c2
$c1 ge $c2
$c1 gt $c2
$c1 le $c2
$c1 lt $c2
@tab = split /sep/, $c1
$c = join "sep", @tab
$c = substr($c1, dep, lg)
Description
concatène 2 chaînes
compare si 2 chaînes sont identiques
compare si 2 chaînes sont différentes
détermine si c1 >= c2
détermine si c1 > c2
détermine si c1 <= c2
détermine si c1 < c2
décompose la chaine c1 en morceau en fonction du
séparateur sep.
rassemble tous les éléments d’un tableau en les juxtaposant
les uns à la suite des autres séparés par le séparateur
mentionné.
extrait une sous-chaîne hors de c1, à partir de la position
dep, sur une longeur lg
4
2.3.2 Opérations sur les données numériques
Syntaxe
$n1 + $n2
$n1 - $n2
$n1 * $n2
$n1 / $n2
$n1++
++$n1
$n1---$n1
$n1 > $n2
$n1 < $n2
$n1 >= $n2
$n1 <= $n2
$n1 == $n2
$n1 != $n2
Description
Addition / soustraction / multiplication
Interprétation identique qu’en C
/
division.
Pré/post incrémentation. Identique qu’en C
Comparaison de deux nombres.
Interprétation identique qu’en C.
2.4 Les conditions
if ($I == $J) {
…
} elsif( $I == $K) {
...
} else {
...
}
if($c1 eq "oui") {
...
}
Observations :
• la syntaxe et l’interprétation sont proches de celle du C
• à l’inverse du langage C, les accolades sont obligatoires (même s’il n’y a qu’une
seule instruction).
2.5 Les boucles
for ($I=0;$I<5;++$I) {
...
}
while ($I <= 5) {
...
}
Observation :
• Le fonctionnement est identique qu’en C
2.6 Parcours d’un tableau ou d’une table
2.6.1 Parcours d’un tableau
for ($I=0; $I < (scalar @tab); ++$I) {
...
}
foreach $I (@tab) {
...
}
Dans la forme de gauche, la variable $I prend successivement tous les indices possibles du
tableau @tab.
Dans la forme de droite, la variable $I prend successivement toutes les valeurs contenues
dans le tableau @tab.
5
2.6.2 Parcours d’une table hachée
foreach $I (keys %hash) {
...
}
Dans cette forme, la variable $I prend successivement toutes les valeurs de clés définies
pour la table hachée %hash.
2.7 Quelques particularités
2.7.1 Les commentaires en PERL
Les commentaires en PERL sont précédés du symbole #.
# Voici un commentaire PERL
2.7.2 Interaction avec le clavier et l’écran
$info = <STDIN>;
print STDOUT $info;
print $info;
print STDERR "Erreur";
La première ligne permet de capturer des données au clavier et de les enregistrer dans la
variable $info.
Les deuxième et troisième lignes font la même chose : afficher à l’écran le contenu de la
variable $info. En effet, l’affichage se fait, par défaut, via STDOUT qui est, dès lors,
facultatif.
La dernière ligne permet d’envoyer un message d’erreur sur le flux STDERR. Par défaut,
celui-ci est connecté à l’écran.
2.7.3 Exécution d’une commande
my $cmd = "/usr/bin/who";
my $result = `$cmd`;
Dans cet extrait, la variable $cmd contient la chaîne /usr/bin/who (qui est le chemin vers
une commande du système). Ensuite, les apostrophes inverses sont utilisées pour exécuter
un programme externe. Le résultat que ce programme produit sur le STDOUT est récupéré
dans la variable $result.
2.8 Les fichiers
PERL permet une manipulation aisée des fichiers textes. La première chose à définir pour la
gestion des fichiers est le descripteur (ou handle). Il se déclare comme n’importe qu’elle
autre variable simple.
my $FHANDLE;
6
2.8.1 Ouverture du fichier
L’ouverture du fichier s’effectue par la commande open. PERL définit 3 modes d’ouverture :
ouverture en lecture, ouverture en écriture (ou écrasement) et ouverture en extension (ou
ajout).
open(FHANDLE, "< fichier.txt");
open(FHANDLE, "> fichier.txt");
open(FHANDLE, ">> fichier.txt");
La première ligne mentionne l’ouverture en lecture (c’est l’option par défaut). La seconde
ligne provoque la création ou l’écrasement du fichier tandis que la dernière ligne ouvre le
fichier en mode ajout.
2.8.2 Lecture
La lecture à partir du fichier s’effecture comme la lecture à partir du flux STDIN vu cidessus :
$ligne = <FHANDLE>
while($ligne) {
chomp($ligne);
...
print "la donnée lue est : $ligne\n";
$ligne = <FHANDLE>
}
Ce petit code montre comment il est possible de lire le contenu d’un fichier ligne par ligne.
La fonction chomp permet de supprimer les caractères de passage à la ligne.
PERL permet d’écrire cette lecture sous une forme raccourcie :
while(<FHANDLE>) {
chomp;
...
print "la donnée lue est : $_\n";
}
On remarque dans cette forme raccourcie la disparition de la variable $ligne. En fait, on
utilise implicitement la variable désignant l’entrée par défaut (voir section 2.2.4) qui contient
les données lues depuis le fichier.
2.8.3 Ecriture
L’écriture d’une ligne dans le fichier texte (pour autant que cela soit compatible avec son
mode d’ouverture) est très simple en PERL … en effet, on remarque encore la syntaxe
utilisée pour les flux :
print FHANDLE "Un petit texte\n";
Cette instruction provoque l’écriture du message dans le fichier texte.
7
2.8.4 Fermeture
La fermeture du fichier se fait via la fonction close.
close (FHANDLE);
2.9 Les expressions régulières
Une des plus grande force de PERL est probablement l’intégration des expressions
régulières.
On pourrait définir une expression régulière comme :
• une représentation, un masque que PERL va tenter d’appliquer sur un texte (un peu
comme le format de l’instruction scanf en C)
o Si le masque est compatible, c’est que le texte correspond à la description
attendue. Il est alors possible d’effectuer des opérations
o Si le masque est incompatible, c’est que le texte ne correspond pas à la
description fournie
Les expressions régulières sont très utiles lorsqu’il s’agit d’analyser un fichier texte (comme
les fichiers CSV par exemple). En PERL, les expressions régulières sont toujours encadrées
des symboles slash (/ expression_régulière /).
Les conventions suivantes sont d’applications. Voici un tout petit extrait de ces expressions
régulières :
Symbole
\s
\S
^
$
a
a+
a*
(ab)+
[^abc]
[a-z]
.
()
Description
un espace ou une tabulation
un caractère qui n’est ni un espace, ni une tabulation
premier élément de la ligne
dernier élément de la ligne
le caractère a
répétition (1-N) du caractère a
répétition (0-N) du caractère a
répétition (1-N) de la séquence ab
n’importe quel caractère qui n’est pas a, b ou c
n’importe quelle lettre minuscule
un caractère (n’importe lequel)
permet d’identifier l’élément concerné
Quelques exemples :
Le contenu
aaaaaaaa
correspond notamment à ces expressions
\S+
\S*
.*
a+
a*
abababaaaababab
^(ab)+a*(ab)+$
[ab]*
.*
2.9.1 Manipulation des expressions dans un programme
PERL permet d’intégrer les expressions régulières à de nombreux endroits. Ainsi, on peut
toujours vérifier si une donnée correspond à une expression donnée avec la comparaison sur
base d’expression écrite =~.
8
my $data = "aaaaaaaa";
if($data =~ /a*/) { print "répétition de a\n"; }
elsif ($data =~ /^(ab)+a*(ab)+$/) { print "séquence ab-a-ab\n"; }
else { print "séquence inconnue\n"; }
Une autre grande force de PERL est sa capacité d’identifier une expression régulière en
attribuant des variables locales à des morceaux de celle-ci. Par exemple :
my $data = "
Louis;SWINNEN;Av. Machin;2;4020;LIEGE";
if($data =~ /^\s+([^;]*);(\S*);(.*);(.);([0-9]+);([A-Z]*)$/) {
my $prenom = $1;
my $nom = $2;
my $adresse = $3;
my $bte = $4;
my $cp = $5;
my $loc = $6;
print "Prenom = $prenom, nom = $nom, localite = $loc\n";
} else {
print "Erreur d’analyse\n";
}
Comme nous pouvons le voir dans cet exemple, PERL attribue des variables locales $1 … $6
à tous les groupes de parenthèses. Ainsi l’exécution du code remplira les variables $prenom,
$nom, $adresse, $bte, $cp et $loc avec les valeurs qui sont contenues dans la zone de
texte.
2.9.2 Les expressions régulières dans l’analyse d’un fichier texte
Il est très courant d’analyser un fichier texte au moyen d’expressions régulières. Il s’agit là
d’un moyen puissant de gestion et manipulation des données. Ainsi dans les schémas que
nous avons vu précédemment, voici comment les expressions régulières vont venir s’insérer :
$ligne = <FHANDLE>
while($ligne) {
chomp($ligne);
if($ligne =~ / mon_expression_regulière_de_la_mort /) {
...
} elsif($ligne =~ /ma_deuxieme_expression/) {
...
} else {
print "Erreur d’analyse (ligne : $ligne)\n";
}
$ligne = <FHANDLE>
}
Dans cet exemple, nous supposons que nous avons besoin de deux expressions régulières
différentes pour analyser le fichier texte, ce nombre peut être très variable.
9
Voici la seconde forme (raccourcie) :
while(<FHANDLE>) {
chomp;
if(/mon_expression_regulière_de_la_mort /) {
...
} elsif(/ma_deuxieme_expression/) {
...
} else {
print "Erreur d’analyse (ligne : $_)\n";
}
}
10