Cours sur
le langage
Jacquenod Frédéric
|
) :
frederic.jacquenod@jacquenod.net Web:
http://portail.jacquenod.net |
|
I Introduction
II Premiers pas
III Les variables
simples et composées
III.1
Les chaînes de caractères
III.2
Les nombres
III.3
Les listes
III.4
Les tableaux associatifs
III.5
Les bases de données et les tableaux dbm
III.6
Remarque
IV Les entrèes-sorties
IV.1
Lecture des données
IV.2
Ecriture des données
V Les opérateurs de
test et les expressions régulières
V.1
Les opérateurs de test
V.2
les expressions régulières
VI Les conditions et
les boucles
VI.1
Les conditions
VI.2
Les boucles
VII Les Fonctions
VII.1
Création d’une fonction
VII.2
Quelques fonctions systèmes utiles
VIII Autres éléments du
langage
VIII.1 Les paquetages
VIII.2 Les modules
I
Introduction
Il
y a une multitude d'autres langages dans le monde informatique (ADA, Cobol, C,
Lisp,prolog, Ksh, Fortran, java ...).
Alors
pourquoi utiliser PERL alors que de nombreux autres langages existent et que
vous connaissez peut être l'un de ces langages ?
Ils
ne se valent pas tous, ne sont pas toujours adaptés au travail que l'on veut
faire, au problème à résoudre. Certains sont très hermétiques car trop proches
du langage machine (...), d'autres assez complexes à utiliser (C, C++ ...),
d'autres encore, très universitaires mais peu adaptés à l'entreprise (Pascal).
Le
PERL (Pratical Extraction and Report Language) qui signifie littéralement
Extraction Pratique et langage de Rapport, n'est ni un langage compilé, comme
peuvent l’être le C, le pascal, le fortran ... ni un langage proprement dit
interprété comme peuvent l’être le Korn Shell, awk...; mais un mixte des deux.
Le "moteur" perl, analyse tout d'abord le programme en entier (afin
de trouver d’éventuels erreurs de syntaxe), et seulement ensuite il l’exécute
mais son exécution ne nécessite aucune compilation et aucune création d'objets.
Ce
langage n'est pas typé, comme le C. Il ne nécessite aucune déclaration de type
d'objets avant de les utiliser ce qui facilite largement les choses. La base de
travail en PERL est la variable scalaire qui peut contenir, une chaîne de
caractères comme un nombre ou une référence style pointeur. Ce langage de part
les éléments qu'il propose est très simple d'utilisation pour des traitements
de chaînes, des séquences, des recherches d’occurrences ...
Il
est notamment utilisé dans des entreprises de traduction automatiques de
langages style Systran. De mon coté je l'utilise beaucoup pour des
programmations automatiques (statistiques, traitement de fichiers mot de passe
...) ainsi que pour réaliser des traitements de données provenant de
formulaires sur l'internet comme langage pour mes CGI (questionnaires,
statistiques ...).
De
plus ce langage a le gros intérêt d’être gratuit, et assez facilement
installable sur votre machine linux, macintosh, windows ... On le retrouve sur
toutes les plates-formes. Il existe aussi de nombreux packages crées par la
communauté des programmeurs pour vous faciliter le travail (Fonctions
mathématiques ...).
Pour
utiliser PERL il suffit de l'installer, de disposer les instructions dans un
fichier texte, de le rendre exécutable (droit x sous unix), lisible (droit r
sous unix) et de taper en ligne de commandes le nom de ce fichier pour que
l’exécution commence. Ne pas oublier dans ces instructions le chemin d'accès de
votre moteur PERL. Sous unix pour le connaître tapez :
which
perl, si celui-ci est normalement installé vous devriez obtenir une réponse du
type :
/usr/local/bin/perl
Nous
travaillerons sur plate-forme unix, avec le perl version 5. Ce cours est
orienté traitement automatique de données en provenance du web.
*J'ai bâti ce cours à partir des informations provenant
de l'internet notamment la documentation du CPAN (Comprehensive Perl Archive Network)
que vous pouvez retrouver sur le site : http://www.perl.com

*ainsi que sur deux livres aux éditions O'Reilly
"Introduction
à PERL" et "PERL en action".


Vous
trouverez d’autres aides et informations dans les sites suivants :
*www.search.cpan.org

*Pour récupérer la distribution, le site ftp de jussieu
est un bon point de départ
ftp.jussieu.fr/pub/perl/CPAN

*Le site www.perl.org peut aussi vous donner quelques
informations notamment pour acheter les t-shirt et autres casquettes à l’effigie
de Perl J


*Et pour ceux qui veulent devenir des gourous du Perl
et rester à l’affût de tout ce qui se fait de nouveau, ou tout simplement pour
trouver de l’aide parmi les perliens, regardez les newsgroup :

II
Premiers pas
J'ai
choisi de bâtir mon cours de la manière suivante :
/chaque partie importante possède son propre chapitre
comme ça pas de jaloux.
/je proposerai une série d’exercices pour illustrer
chaque partie du cours.
|
C’est
en forgeant que l’on devient |
|
/Deux ou trois petites choses avants de débuter dans le
monde PERL qui est un bijoux comme langage (Il fallait oser, je l'ai fait ...).
/Je vous ai indiqués dans l'introduction que pour
utiliser perl il fallait l'avoir installer et savoir où il se situait dans
l'arborescence de votre machine. La première ligne à mettre dans votre fichier
texte (exemple : traite.pl) sera celle l'indiquant. Exemple, le moteur perl se
situe dans le répertoire /usr/local/bin.
Indiquez
dans votre fichier la directive suivante :
#!/usr/local/bin/perl
-w
Explication
: Si vous omettez cette ligne, l'interpréteur utilisé sera le shell utilisé
lors de votre connexion sur la machine à savoir ksh, bash ... qui ne
connaissent pas du tout le langage perl. Vous aurez alors une erreur dès la
première ligne.
Le
-w à la fin permet d'obtenir en cas de problème des messages plus clairs et des
avertissements (warning) en cas de doutes lors de l’exécution.
Vous
pouvez sinon tapez en ligne de commande directement :
>
/usr/local/bin/perl -w traite.pl
/Les commentaires sont préfixés par le caractère #.
Ne
pas confondre avec la directive précédente où vous associez le # avec le !.
Usez
de ces commentaires, très utiles pour une personne qui reprend votre programme
ou même pour vous pour savoir ce que vous faites, ou quels sont les formats des
données à cette ligne là ...
/N'oubliez pas que votre fichier traite.pl doit être
exécutable et lisible (interpréteur).
chmod
u+rx traite.pl suffit si vous seul l’exécutez.
Précision
: si votre programme perl doit servir de script cgi pensez que c'est le
propriétaire du serveur web qui doit pouvoir exécuter ce programme (Voir partie
Installation d'un serveur web Apache dans le cours Réseau). Il vous faudra
alors donner les droits d’exécution, certainement, à tous (chmod o+rx traite.pl).
Voilà
vous êtes parés pour débuter ... Bon courage.
III Les variables simples et composées
Le langage perl a un avantage
indéniable par rapport aux langages C, pascal ... il ne nécessite pas de typer
et de déclarer les éléments que l’on va utiliser (tableaux, chaîne de caractère
...). Vous voulez une chaîne de caractères, ou un nombre, la syntaxe est la
même. Pas besoin d’indiquer que la variable sera de type entière, réelle,
caractère ...
Seul le préfixe ($ , @,
%) du nom de votre variable va déterminer si c’est une chaîne, une liste ou un
tableau associatif. Ce que vous rangez dedans est presque accessoire.
III.1 Les chaînes de
caractères
1. Présentation
Nous allons étudier dans
cette partie, comment utiliser une chaîne de caractères
ainsi que les différentes
opérations qui peuvent être effectuées.
Attention,
la chaîne de caractères est une entité « entière » ; c’est à
dire que vous ne pouvez pas accéder à un élément particulier via un indice
comme en langage C par exemple chaîne[1]. Vous devez passer par des fonctions
pour pouvoir le faire.
Lorsque vous utilisez une
chaîne de caractères, pas besoin d’en indiquer la taille. Ici aussi c’est un
gros avantage sur d’autres langages. Que vous rangiez un caractère ou 1000, la
syntaxe est la même. Perl se débrouille pour gérer l’espace mémoire.
2. Notation
Une chaîne est définie par le
préfixe : $ (dollar)
$variable correspond à une chaîne de caractères appelée variable.
3. Affectation
Une affectation se fait tout
simplement en utilisant des apostrophes doubles ou des apostrophes
simples.
Attention la signification n’est pas la
même.
$variable = “ truc chose” ; -> truc chose
$variable = “ \n” ; -> retour chariot
$variable = “ $chaine1” ; -> contenu de la variable chaine1
$variable = ‘\n‘ ; -> \n La chaîne a pour valeur les deux caractères \
et n
$variable = ‘$chaine1’ ; -> $chaine1
Pour introduire dans la
valeur un caractère spécial utilisez des antislash (\) pour désactiver son
caractère particulier.
$variable = “ truc \” chose” ; -> truc “ chose
$variable = ‘j\’ai vu l\’armoire bretonne’ ; -> j’ai vu l’armoire bretonne
Si vous avez un texte,
contenant des apostrophes simples ou doubles, a affecter à une chaîne de
caractères, il peut être fastidieux de les décommenter à chaque occurrence. Vous pouvez
utiliser alors deux moyens.
a. Le caractère q permet
d’utiliser d’autres délimiteurs que les apostrophes.
Le / ou des délimiteurs qui
s’ouvrent et se referment.
$variable = q/j’ai vu l’armoire bretonne/; -> j’ai vu l’armoire bretonne
$variable = q{j’ai vu l’armoire bretonne}; -> j’ai vu l’armoire bretonne
$variable = q[j’ai vu l’armoire bretonne]; -> j’ai vu l’armoire bretonne
$variable = q(j’ai vu l’armoire bretonne); -> j’ai vu l’armoire bretonne
$variable = q<j’ai vu l’armoire bretonne>; -> j’ai vu l’armoire bretonne
b. Vous pouvez utiliser un
document « ici-meme ». Vous donnez un délimiteurs qui sera un mot
clé. Ce mot clé devra être seul sur la dernière ligne pour clore l’affectation.
$variable << “FIN” ;
J’ai vu l’armoire bretonne, ce n’est pas une FIN en
soi mais
elle se nomme “ L’Armoire” avec un grand A.
FIN
-> j’ai vu l’armoire bretonne, ce n’est pas une FIN
en soi mais
elle se nomme “ L’Armoire” avec un grand A.
4. Autres chaînes
. La seule chaîne non définie
est undef. On la retrouvera dans
les tests booléens, ouverture de fichiers ...
. La chaîne vide :
$chaîne = “ “ ;. Cette chaîne
est définie mais a une valeur logique égale à faux.
. La chaîne qui a la valeur
0 : $chaîne = “0” ; a
aussi une valeur logique égale à faux.
. Une chaîne particulière est
$_. $_ est la variable
globale par défaut si aucune n’est spécifiée. Si vous lisez le contenu d’un
fichier avec une boucle while et que vous ne spécifiez pas de chaîne pour
récupérer les valeurs lues, elles seront alors rangées dans la variable $_. On
peut omettre $_, c’est la variable par défaut.
|
while(<fichier>) |
|
while($_ =
<fichier>) |
|
while($ligne =
<fichier>) |
|
{ |
|
{ |
|
{ |
|
chop ; |
|
chop $_ ; |
|
chop $ligne; # on utilise une |
|
print ; |
|
print $_; |
|
print $ligne; #
variable: $ligne |
|
} |
|
} |
|
} |
III.2 Les nombres
1. Présentation
Comme vu précédemment, Perl
ne se soucie pas du type de la variable utilisée. Si vous l’utilisez comme un
nombre, perl transforme le contenu en nombre, à contrario si vous l’utilisez
comme des caractères, perl transforme le contenu en caractères.
La lecture d’un fichier
donnera donc moins de soucie qu’avec un langage typé. Vous lisez les éléments
de la même façon, seul l’utilisation à posteriori déterminera le type de la
variable. Elle peut d’ailleurs être utilisée à un, moment donné comme une
chaîne de caractères puis la ligne suivante comme une variable contenant un
nombre.
Attention
tout de même, si une variable est utilisée pour contenir des nombres, perl
transforme les éléments non numériques en zéro et s’arrête lors de cette
transformation dès qu’il qu’il trouve le premier élément non numérique.
Exemple : B52 vaut en
nombre 0 tandis que 52B vaut 52. (mince mon numéro de carte bleue ...). Vous
aurez d’ailleurs un warning au moment de l’exécution du programme.
2. Notation
La notation est la même que
pour les chaînes de caractères ; préfixe $ (dollar).
$variable = “23” ; ou $variable =
23 ;
La valeur 0 a pour valeur
booléenne la valeur fausse.
Vous pouvez comparer dans vos
tests ces valeurs au mot clé false.
Les valeurs hexadécimales
sont notées : 0x...
0xf représente la valeur 15
en décimale. 0xff représente la valeur décimale 255 (1 octet plein)
Nous verrons des fonctions
pour obtenir des nombres aléatoires dans la partie VII.
III.3 Les listes
1. Présentation
La liste est une suite
d’éléments, chaînes de caractères ou nombres ou les deux.
Les listes sont rangées dans
des tableaux. Pour perl la distinction entre une liste et un tableau est assez
subtile.
La liste est le terme utilisé
pour définir le contenu, les éléments.
Le tableau est la variable,
la structure qui référence ce contenu.
La suite des éléments étudiants, note,
0 est une liste. La variable controle
qui contient ces trois éléments est
un tableau. Vous travaillerez donc sur les tableaux mais pas directement sur
les listes.
Exemple parlant :
|
|
Prenons ce superbe pot de
cornichons. /La liste est constituée des éléments que sont les
cornichons, le vinaigre, les aromates ... /Le tableau lui est le pot qui contient ces
cornichons. Frappant non ! |
Les éléments d’un tableau
sont rangés dans un ordre référencé par des indices. Ces indices commencent par
0. Vous pouvez donc atteindre un élément directement via son indice, à la
différence de la chaîne simple vue précédemment.
2. Notation
Le préfixe @ permet de
déterminer que c’est un tableau.
La notation est la
suivante : @pot
3. Affectation
L’affectation se fait de la
manière suivante :
@pot = (“cornichon1”,”vinaigre”,”aromates”) ;
bleu -> tableau
rouge -> liste
L’élément cornichon1est situé à l’indice 0 du tableau pot et peut être atteint grâce à la notation
suivante :
$pot[0]
$pot[1] est l’élément vinaigre du
tableau pot.
Un élément du tableau est une
chaîne de caractères d’où la notation $.
4. Deux ou trois choses à
savoir pour vous simplifier la vie
/Le tableau @_ est particulier. Il est utilisé dans les
fonctions (Voir chap VII Les fonctions). Lorsque vous passez des arguments lors
de l’appel de la fonction, ceux-ci sont rangés dans le tableau @_. La première
valeur sera donc dans $_[0], la deuxième dans $_[1] et ainsi de suite.
Attention,
lorsque vous utilisez des paquetages et que vous appelez une fonction le
premier élément n’est pas la valeur passée mais le nom du paquetage.
Voir la partie sur les
paquetages partie VIII.
Définition
sub calcul {
return $somme =
$_[0] + $_[1] ;
}
Appel
print calcul(2,3); -> 5
/Imaginez que votre pot de cornichons soit plein. Vous
venez de l’acheter par exemple. Vous voulez connaître le nombre d’ingrédients
qui composent votre pot.
Vous pouvez tout sortir et
les compter, pas très simple. Vous avez avec perl un moyen simple.
Pour déterminer rapidement le
nombre d’éléments contenus dans un pot oups dans un tableau, il suffit de
travailler sur les références (les pointeurs), et utiliser :
$nombre = @pot ; -> $nombre vaut alors 3
/Vous pouvez aussi vouloir le nombre d’indices :
$#nombre = @pot ; -> $#nombre vaut alors 2 (les indices commencent à 0)
/Ajouter un élément simplement à votre tableau :
@pot = (@pot,”colorants”) ; -> vous avez maintenant 4 éléments
/Récupérer rapidement des éléments du tableau :
@pot[0..2]; -> Vous obtenez les 3 premiers éléments cornichon1 vinaigre aromates
/Effectuer des inversions dans le tableau :
@pot[1,2] = @pot[2,1]; -> la
liste cornichon1 vinaigre aromates colorants
devient cornichon1 aromates
vinaigre colorants
III.4 Les tableaux
associatifs
1. Présentation
Ces tableaux particuliers
sont aussi appelés hachages ou tables.
Ils permettent d’associer
deux éléments en en faisant une paire.
Le premier étant la clé et le
deuxième la valeur.
Le couple est (clé,valeur).
La clé peut être n’importe
quoi (chaîne de caractères, nombre ...).
2. Notation
Le préfixe est alors %
(pourcent).
3. Affectation
L’affectation se fait de la
façon suivante :
%note =(“etudiant1”, 10,
“etudiant2”,9,
“etudiant3”,”absent”,
“pot de cornichons”, ”12 francs 50”) ;
Vous pouvez aussi tout mettre
linéairement.
%note =(“etudiant1”, 10,
“etudiant2”,9,”etudiant3”,”absent”,”pot de cornichons”, ”12 francs
50”) ;
Ou encore :
%note =(“etudiant1” => 10,
“etudiant2” =>9,
“etudiant3” =>“absent”,
“pot de cornichons” =>“12 francs 50”) ;
Dans ces trois cas les
couples sont (etudiant1,10) ; (etudiant2,9) ; (etudiant3,absent) et
(pot de cornichons, 12 francs 50). Le premier élément contenu dans la parenthèse
est la clé (l’indice) et le deuxième la valeur.
Pour atteindre directement le
couple (pot de cornichons, 12 francs 50) il faut utiliser la notation :
$note{“ pot de cornichons”}; -> on obtiendra la valeur 12 francs 50
Attention afin d’optimiser les
extractions d’éléments, perl réordonne à sa manière les couples dans le tableau
associatif. Ainsi si vous entrez les couples dans un certains ordre, vous
pouvez être assuré(e) qu’elles ressortiront en « désordre ».
Le premier élément entré ne
sera pas forcément en première position dans votre tableau associatif.
L’extraction des couples se
fait avec des opérateurs tels foreach que l’on verra dans la partie VI.
Il existe un hachage
intéressant contenant les variables d’environnement : %ENV.
$ENV{“PATH”};-> vous obtiendrez sous système unix et linux, la valeur de votre variable
d’environnement PATH
III.5 Les bases de
données et les tableaux dbm
1. Présentation
Ce système est une
bibliothèque qui fournit un utilitaire simple de gestion de base de données en
stockant des paires (clé,valeur) sur disque.
Une fois ouverte, toutes les
manipulations seront répercutées dans
les fichiers sur disque.
Attention à
la fin de chaque clé un caractère NULL est ajouté au moment du stockage. Il
faut donc pour récupérer une valeur procéder de la manière suivante :
$val = $tab{"cle\0"};
chop($val); # pour l'affichage
Vous pouvez utiliser en perl
5 la fonction chomp un peu plus puissante.
2. Pour associer une base
de données dbm à un tableau dbm
dbmopen(%tableau_associatif,"dbmfichier",$mode);
Le premier paramètre est un
tableau associatif
Le deuxième paramètre est la
base de données composée de deux fichiers dbmfichier.dir et dbmfichier.pag
Le troisième paramètre est le
mode d'accès en octal du fichier. Si le fichier existe déjà ce paramètre n'est
pas utile et peut être remplacé par la valeur indéfinie undef.
3. Pour stopper
l’association entre le tableau et la base de données
dbmclose(%tableau_associatif);
4. Pour accéder à des
données ayant une taille fixe
Cette méthode permet
d'atteindre les données (enregistrements) de manière plus rapide et plus direct
en "sautant" autant d'octets que nécessaire.
- L'ouverture :
open(DESC,"mode");
Où mode est : +<fic on ouvre le fichier fic en lecture/Ecriture.
Le fichier
doit déjà exister.
+>fic
on crée le fichier fic puis on l'ouvre en Lec./Ecr.
+>>fic
on ouvre ou on crée (si fic n'existe pas) puis on ouvre
en Lect./Ecr.
- Le positionnement :
seek(DESC,nb_octets_a_passer,position_de_départ);
- L'écriture :
print DESC données;
Attention il est impératif que les
données soient de la taille d'un enregistrement. Une fonction est pratique pour
faire cela : pack.
print DESC
pack("format",$champ1,$champ2, ...);
Où format désigne le nombre
d'octets de chaque champ.
Exemple : A40AA20s
A40 indique
que le premier champ sera formaté sur 40 octets
A indique que le deuxième champ
sera formaté sur 1 octet
A20 indique
que le troisième champ sera formaté sur 20 octets
s indique que le quatrième champ
sera formaté sur un entier court
(2 octets)
- La lecture :
read(DESC,$buffer,$nb_octets_a_lire);
La valeur de retour est le
nombre d'octets lus.
Une fois l'enregistrement lu
il faut récupérer chaque champ. Une fonction du même ordre que pack nous y aide
: unpack.
L'enregistrement est stocké
dans la variable buffer.
($champ1,$champ2,...) =
unpack("format",$buffer);
(La partie format a été
expliquée au dessus)
III.6 Remarque
![]()
$pot
@pot
%pot
sont trois entités
différentes même si elles portent le même nom. Il est préférable pour la
compréhension d’éviter cela. Ne rajoutez pas de difficultés pour rien.
IV Les entrèes-sorties
IV.1 Lecture des
données
stdin est l'entrée standard
par défaut.
Chaque élément lu conserve en
dernier caractère le retour chariot (\n) d'où l'utilisation d'une commande
supprimant le dernier caractère d'une variable : chop.
1. Au clavier
$name =
<stdin>;
Le retour chariot termine la
lecture
@liste = <stdin>;
Chaque ligne entrée est un
élément du tableau. Il est nécessaire de finir par <ctrl><d>
En boucle (pour terminer la
boucle <ctrl><d>) :
while(<>)
{ print "la valeur : $_\n"; }
<> est l'opérateur diamond
$_ est la variable de stockage par défaut si aucune
n'est précisée
Ou
while($valeur = <stdin>)
{ print "la valeur : $valeur\n"; }
2. Dans un fichier
Tout comme dans la majorité
des langages, il est nécessaire d'ouvrir le fichier, de récupérer les données
et de le refermer.
open(DESC,"fichier"); #
On ouvre le fichier
while($valeur = <DESC>) # On lit les données par
lignes
{
chop($valeur); #
On supprime le retour chariot
print "la valeur : $valeur\n"; #
On affiche la valeur lue
}
close(DESC); #
On ferme le fichier
On pourrait pu, comme
précédemment, utiliser la variable par défaut :
open(DESC,"fichier"); #
On ouvre le fichier
while(<DESC>) #
On lit les données par lignes
{
chop; #
On supprime le retour chariot