Cours sur le langage

PERL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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