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
print "la valeur : $_\n"; #
On affiche la valeur lue
}
close(DESC); #
On ferme le fichier
3. En ligne de commande
lors du passage de paramètres
Les arguments sont stockés
dans un tableau prédéfini : @ARGV
$ARGV[0] -> premier paramètre
Si il n'y a pas de paramètre
@ARGV renvoie '-' ou $#ARGV -1
if(@ARGV == '-') {print "Aucun paramètre sur la
ligne de commande\n";}
Ou
if($#ARGV == -1) {print "Aucun paramètre sur la
ligne de commande\n";}
IV.2 Ecriture des
données
stdout est la sortie standard
par défaut.
Le backslash (\) permet de
désactiver la spécificité de certains caractères.
1. Sortie simple
a. A l'écran
simple :
print "Je suis sur votre écran\n";
print "la valeur est :
$tab{\"cle\"}\n";
Vous pouvez aussi utiliser
les syntaxes suivantes si vous préférez.
print "Je suis",
"sur votre écran\n";
print "Je
suis"."sur votre écran\n";
print("Je suis sur votre
écran\n");
formaté :
printf "%6s %3d %4.2f\n",$s,$d,$f;
%6s
sortie caractère sur 6 caractères
%3d
sortie d'un entier sur 3 caractères
%4.2f sortie d'un réel sur 4 caractères dont 2 après
la virgule
b. Dans un fichier
DESC est le descripteur du
fichier de sortie à ouvrir avant l'écriture grâce à la commande open. N'oubliez
pas de le fermer au moyen de la commande close.
Les différents formats
d’ouverture sont :
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.
simple :
print DESC "Je suis dans votre fichier\n";
formaté :
printf DESC "%6s %3d %4.2f\n",$s,$d,$f;
2. Sortie formatée en
utilisant le mot clé format
Ce type de sorties permet
d'avoir un affichage plus précis avec un format prédéfini (un peu comme avec un
printf mais plus simple d'utilisation et plus puissant).
Pour définir un format vous
devez utiliser le mot clé format, le définir puis afficher vos résultats au
moyen de la commande write.
* Description d'un format :
format nom_du_format =
descriptif de la sortie
.
* nom_du_format :
2 types de nom sont
possibles, pour l'entête et pour le corps de l'affichage. (NOM_TOP et NOM)
Attention :
N'oubliez pas le caractère . (point) qui termine la définition d'un format. Ce
point doit être en première colonne dans votre fichier sinon vous risquez
d'avoir une erreur.
descriptif de la sortie :
Ce descriptif comprend 2
parties essentielles le format d'affichage et les variables à afficher.
1.
le format d'affichage
Cette partie permet de
connaître la façon dont vont être
affichées les données (l'endroit, la manière, la taille ...). La taille
est définie par le nombre de signes présents après le signe @ ou ^
@>>>> indiquera
que la valeur sera affichée sur 4 caractères justifiés à droite
@<<<< même chose
mais justifié à gauche
@|||| même chose mais
centré
@###.## champ numérique avec
2 chiffres après la virgule
@* champ multiligne, on ne
s'occupe pas de la taille du champ à afficher
^>>> affichera un
champ sur plusieurs lignes de 3 caractères (lignes vides incluses)
~ ^>>> même chose
mais sans les lignes vides
~~ ^>>> même chose
mais répétera l'affichage jusqu'à trouver une ligne vide
2.
les variables à afficher
$variables1,$variables2, ....
* Affichage à l'écran :
Le nom du format sera STDOUT
qui par défaut est la sortie standard.
STDOUT_TOP sera le nom du
format pour l'entête.
* Affichage dans un fichier :
Le nom du format sera le nom
du descripteur du fichier (par exemple DESC).
DESC_TOP sera le nom du
format pour l'entête.
* Quelques exemples :
Problématique : On
désire écrire les noms et prénoms des personnes contenus dans un tableau
associatif par colonnes avec comme entête les mots Nom Prénom et le contenu du
tableau :
format STDOUT_TOP = #
Permet d'écrire la première ligne
Nom Prénom #
La première ligne
. #
Fin du format pour l'entête
format STDOUT = #
Permet d'écrire les données formatées
@>>>>>>>>
@>>>>>>>>>> #
Format d'affichage des 2 champs justifié
#
à droite
$nom, %tab{$nom} #
nom sur 8 caractères et le prénom sur 10
. #
Fin du format
foreach $nom (keys %tab) # boucle permettant l'affichage
du tableau
{
$prenom = $tab{$nom};
write;
}
Attention :
Ne pas mettre de commentaires comme ici dans la définition
d'un format ceux-ci seraient
affichés lors de l'affichage.
Problématique : On
désire faire la même chose mais dans un fichier.
Nous allons donc nommer le
format du nom du descripteur du fichier.
format DESC_TOP = ... # Sera
l'entête lors de l'affichage dans le fichier
#
référencé par le descripteur DESC
format DESC = ... #
Sera le format d'affichage du corps
#
dans le fichier
open(DESC,">fichier"); #
On ouvre en écriture le fichier "fichier"
#
référencé par le descripteur DESC
foreach $nom (keys %tab) # boucle permettant l'affichage
du tableau
{
$prenom = @tab{$nom};
write DESC; #
On affiche les résultats dans le fichier
}
close(DESC); #
On ferme le fichier
3. Caractères spéciaux
Lors de la sortie écran,
certains caractères précédés d’un antislash permettent d’effectuer des
opérations particulières.
Fonction |
Exemple |
Résultat |
\n |
|
Passage à la ligne |
\r |
|
Retour chariot |
\t |
|
Tabulation |
\f |
A tester |
Passage à la page suivante |
\b |
|
Retour en arrière |
\v |
|
Tabulation verticale |
\a |
|
Bip sonore |
Transformations en majuscules ou minuscules |
||
\U |
print “\Ufred”; |
FRED -> Tous les caractères en majuscule |
\u |
print “\ufred”; |
Fred -> Le premier caractère en majuscule |
\L |
print “\uFRED”; |
fred -> Tous les caractères en minuscule |
\l |
print “\lFRED”; |
fRED -> Le premier caractère en minuscule |
V Les opérateurs de
test et les expressions régulières
V.1 Les opérateurs de
test
1. Les opérateurs
appliqués aux chaînes de caractères
Opérateurs de comparaison |
|||
Opération |
Opérateur |
Exemple |
Conditions logiques |
Egal |
eq |
$a eq $b |
Vrai si $a égal à $b |
Différent |
ne |
$a ne $b |
Vrai si $a est différent de
$b |
Inférieur |
lt |
$a lt $b |
Vrai si $a inférieur à $b |
Inférieur ou égal |
le |
$a le $b |
Vrai si $a inférieur ou
égal à $b |
Supérieur |
gt |
$a gt $b |
Vrai si $a supérieur à $b |
Supérieur ou égal |
ge |
$a ge $b |
Vrai si $a supérieur ou
égal à $b |
|
|
|
|
Opérateurs logiques |
|||
Opération |
Opérateur |
Exemple |
Conditions logiques |
Et |
&& |
$a && $b |
Vrai si $a est vrai et si
$b est vrai |
|
and |
$a and $b |
Vrai si $a est vrai et si
$b est vrai |
Ou |
|| |
$a || $b |
Vrai si $a est vrai et/ou
si $b est vrai |
|
or |
$a or $b |
Vrai si $a est vrai et/ou
si $b est vrai |
Négation |
! |
!$a |
Vrai si $a est faux |
|
not |
not $a |
Vrai si $a est faux |
|
|
|
|
Autres opérateurs |
|||
Opération |
Opérateur |
Exemple |
Conditions logiques |
Concaténation |
. |
$c =$a . $b |
$a=“vin” et $b=“aigre”
alors $c=“vinaigre” |
Incrémentation |
++ |
$a++ |
$a=“fred” -> free |
Décrémentation |
-- |
$a-- |
Testez mais ne fonctionne
pas |
Multiplication |
x |
$b = $a x 2 |
si $a=“cou” -> coucou |
2. Les opérateurs
appliqués aux nombres
Opérateurs de comparaison |
|||
Opération |
Opérateur |
Exemple |
Conditions logiques |
Egal |
== |
$a == $b |
Vrai si $a égal à $b |
Différent |
!= |
$a != $b |
Vrai si $a est différent de
$b |
Inférieur |
< |
$a < $b |
Vrai si $a inférieur à $b |
Inférieur ou égal |
<= |
$a <= $b |
Vrai si $a inférieur ou
égal à $b |
Supérieur |
> |
$a > $b |
Vrai si $a supérieur à $b |
Supérieur ou égal |
>= |
$a >= $b |
Vrai si $a supérieur ou
égal à $b |
|
|
|
|
Opérateurs logiques |
|||
Opération |
Opérateur |
Exemple |
Conditions logiques |
Et |
&& |
$a && $b |
Vrai si $a est vrai et si
$b est vrai |
|
and |
$a and $b |
Vrai si $a est vrai et si
$b est vrai |
Ou |
|| |
$a || $b |
Vrai si $a est vrai et/ou
si $b est vrai |
|
or |
$a or $b |
Vrai si $a est vrai et/ou
si $b est vrai |
Négation |
! |
!$a |
Vrai si $a est faux |
|
not |
not $a |
Vrai si $a est faux |
|
|
|
|
Autres opérateurs |
|||
Opération |
Opérateur |
Exemple |
Conditions logiques |
Ajout |
+ |
$c =$a + $b |
$a=1 et $b=2 alors $c=3 |
Incrémentation |
++ |
$a++ |
$a=1 -> 2 |
Décrémentation |
-- |
$a-- |
$a=1 -> 0 |
Multiplication |
x |
$b = $a x 2 |
si $a=2 -> 4 |
Modulo |
% |
$c = $a % $b |
reste de la division entre
$a et $b |
Puissance |
** |
$c = $a ** 2 |
$a puissance 2 |
La fonction or permet de ne
faire évaluer que la première condition si elle est vraie.
Ceci est très utile lors de
l’ouverture des fichiers. Vous pouvez ainsi utiliser la syntaxe suivante.
open(FICHIER,$nom) or die “Ouverture du fichier
$nom impossible” ;
3. Opérateurs de tests sur
les fichiers
L'utilisation peut être faite
de cette manière :
if( operateur $fichier_repertoire) ....
Opérateur
|
Signification |
-r |
Le Fichier ou le Répertoire
sont lisibles |
-w |
F ou R modifiables |
-x |
F ou R exécutables |
-o |
F ou R propriétaire de
l'utilisateur |
-R |
|
-W |
Mêmes tests que
précédemment mais en fonction |
|
de la présence ou non d'un
setuid |
-X |
|
-O |
|
-e |
F ou R existent |
-z |
F existe et sa taille est
nulle |
-s |
F ou R existent et sa
taille est non nulle |
-f |
C'est un Fichier |
-d |
C'est un Répertoire |
-l |
C'est lien symbolique |
-b |
Fichier spécial de type
bloc (Disque ..) |
-c |
Fichier spécial de type
caractère (E/S ..) |
-u |
F ou R disposant d'un
setuid |
-g |
F ou R disposant d'un
setgid |
-T |
Fichier de type texte |
-B |
Fichier de type binaire |
-M |
Age de la dernière
modification en jours |
-A |
Age du dernier accès en
jours |
-C |
Age de la dernière
modification de l'inode en jours |
V.2 les expressions
régulières
Mais qu’est ce que c’est que
cette chose ?
Tout simplement un étudiant
qui ne bouge pas du début à la fin de mon cours. Il a une expression régulière. Quoi c’est pas ça ?
1. L’opérateur =~
Un expression régulière est
simplement une fonction dérivée de la commande sed qui permet de rechercher, de
substituer des éléments dans une chaîne.
L’opérateur a utiliser est =~. Il faut l’associer aux opérateurs m// pour la recherche d’occurrences et s/// pour celui de substitution.
Vous pouvez les utiliser
notamment lors de tests.
If($chaîne =~ m/aigre /) ...
permettra de déterminer si dans la chaîne il y a l’occurrence aigre.
Si vous voulez modifier une
occurrence dans une chaîne procédez comme suit :
$chaine2 =~ s/truc/chose/;
Les occurrences truc seront transformées en chose dans la chaîne chaine2.
Il y a de nombreuses
combinaisons très pratiques, pour pouvoir utiliser au maximum cette facilité de
traitement des chaînes regardez la documentation sur la commande unix :
sed.
Vous pouvez aussi utiliser la
fonction tr, que nous reverrons, pour effectuer une transformation d’éléments
dans un chaîne.
$chaîne =~ tr/a-z//;
Supprimera tous les caractères alphabétiques minuscules de la chaine $chaine.
2. Changement de taille des
caractères
Fonction |
Exemple |
Résultat |
\U |
$a = “\Ufred”; |
FRED -> Tous les caractères en majuscule |
\u |
$a = “\ufred”; |
Fred -> Le premier caractère en majuscule |
\L |
$a = “\uFRED”; |
fred -> Tous les caractères en minuscule |
\l |
$a = “\lFRED”; |
fRED -> Le premier caractère en minuscule |
VI Les conditions et
les boucles
VI.1 Les conditions
1. if
On retrouve la syntaxe du C
dans le if qui permet de tester une condition et d’effectuer selon le résultat
une action ou une autre.
*Syntaxe
If(condition1)
{
action
si la condition1 est vraie ;
}
else
{
action
si la condition1 est fausse ;
}
*Exemples
if(“$a” eq “$b”){print “Egalité\n”;}
else
{print “Inégalité\n”;}
OU
(“$a” eq “$b”) ? print “Egalité\n” :
print “Inégalité\n”;
Il existe de nombreuses
autres façons d’écrire la condition if. La première reste malgré tout celle que
je recommande car elle est plus explicite que les autres et se retrouve dans de
nombreux autres langages.
if( !open(FICHIER,$nomfichier))
{print “Problème d’ouverture du fichier
$nomfichier” ;}
else
{
print
“Fichier $nomfichier ouvert\n” ;
action
}
2. switch
Le switch en tant que tel
n’existe pas en perl. Il peut être « émuler » avec des elsif
*Syntaxe
If(condition1)
{action si la condition1 est vraie ;}
elseif(condition2)
{action si la condition2 est vraie;}
elsif(condition3)
{action si la condition3 est vraie;}
...
else
{action si toutes les conditions précédentes sont
fausses ;}
3. unless
*Syntaxe
Vous voulez réaliser une
action si la condition est fausse, pour cela utiliser unless.
Unless(condition)
{action si la condition est fausse ;}
else
{action si la condition est vraie ;}
VI.2 Les boucles
1. for
Boucle permettant d'effectuer
une action autant de fois que l'on désire.
*Syntaxe
for(valeur_initiale;test;incrementation)
{
commande;
}
*Exemple
for($i=1;$i<=10;$i++)
{
print
"Le numéro est $i\n";
}
2. while
Boucle permettant d'effectuer
une action tant qu'une condition est vraie.
*Syntaxe
while(condition)
{
instruction;
}
*Exemple
Avec cette boucle vous pouvez
récupérer tous les éléments d’un tableau associatif (Voir aussi la boucle
foreach).
while(($cle,$valeur) = each %hachage)
{
print
”Le couple est : ($cle,$valeur)\n”;
}
3. until
Boucle permettant d'effectuer
une action tant qu'une condition est fausse.
*Syntaxe
until(condition)
{
instruction;
}
4. foreach
Cette boucle ne s’applique
qu’au parcours d’éléments d’un tableau.
On peut aussi utiliser
foreach pour récupérer, dans un tableau associatif, les clés de chaque couple
et permettre ainsi d’extraire la valeur. On utilisera le mot clé keys.
*Syntaxe
foreach $cle (@liste)
{
instruction;
}
*Exemples
@liste = (1,2,3,4);
foreach $element (@liste)
{
print
"l'element est : $element\n";
}
%tableau =
("aix","ibm","macos","macintosh") ;
foreach $cle (keys %tableau)
{
$valeur = $tableau{$cle};
print "la valeur $valeur est associée a la clé $cle\n";
}
VII Les fonctions
VII.1 Création d’une
fonction
1. Présentation
Les sous-programmes permettent
de développer de manière modulaire dans le cas ou plusieurs personnes se
partagent le travail par exemple. Ils permettent aussi de structurer et de
clarifier le programme. Si vous devez répéter plusieurs fois une même suite
d’opérations dans votre programme, optez pour une fonction. Il suffira de
l’appeler plutôt que de réécrire le code de plusieurs lignes.
Les fonctions sont aussi
appelés sous-programmes d’où la notation pour indiquer que l’on crée une
fonction sub (Pour subroutine
traduction en anglais de sous-programme : sub pour sous et routine pour
programme si si je vous assure J).
Les fonctions peuvent être
situées dans le même fichier ou dans un fichier autre.
Dans ce cas il vous faudra
utiliser les mots clés use, require ou do
pour signifier au programme où elles sont situées. Nous reverrons cela plus
tard dans ce cours.
Dans une fonction, sauf si
vous l’indiquez, les variables sont globales. Elles gardent donc leurs valeurs
une fois l’exécution de la fonction terminée.
Si vous n’utilisez pas
l’instruction return pour renvoyer le résultat, c’est alors la valeur de la
dernière expression qui est retournée.
2. Notation
Pour définir une fonction, la
syntaxe est la suivante :
sub nom-de-la-fonction {
Actions ;
}
La partie entre {}, va
déterminer les actions à effectuer. Il peut y avoir des définitions de
variables locales, des passages d’arguments ...
L’appel dans le programme de
la fonction se fera la plupart du temps de la façon suivante (cas le plus
simple, pas d’arguments) :
nom-de-la-fonction();
3. Les arguments
Lorsque vous passez des
valeurs en paramètres, ils sont alors rangés, comme nous l’avons déjà vu dans
le tableau @_. Le premier argument est $_[0] et ainsi de suite.
4. Les variables
Lorsque vous utilisez des
variables par défaut elles sont globales. Si une autre fonction utilise la même
variable, celle-ci aura la valeur définie précédemment ce qui peut avoir des
effets de bords importants et modifier le résultat.
Il peut être donc préférable
de travailler dans une fonction sur des variables locales. Elles n’auront
d’existence qu’a l’intérieur de la fonction, au delà elles ne sont pas connues.
Pour cela il faut utiliser l’opérateur my.
my va permettre de déclarer une variable qui aura une durée de
vie uniquement dans la fonction.
*syntaxe
sub
calcul {
my $chaine_locale;
}
sub
ecriture {
my ($chaine_locale,@tableau_local,%hachage_local);
}
Dans le premier cas nous ne
déclarons qu’une variable locale ou privée qui se nomme $chaine_locale. Mais
rien ne nous empêche de déclarer en une seule fois plusieurs variables locales
que ce soit une chaîne, un tableau ou un hachage.
En dehors de la fonction ces
variables n’auront aucune existence.
La portée de cet opérateur
est généralement limitée aux accolades.
Vous pourrez donc déclarer
des variables locales dans des boucles, des tests.
for($i ;$i<=2 ;$i++)
{
my $a; # Variable
locale à la boucle for
$a =
$i ;
print
$a;
}
print $a ; #
Warning la variable $a n’est pas initialisée et n’a pas de valeur
Vous pouvez initialiser la variable
tout en lui affectant sa valeur. Imaginez que vous passez des paramètres à
votre fonction calcul. Que ces paramètres vous voulez les manipuler mais
uniquement localement et ne pas travailler sur le tableau initial @_ pour
éviter des effets de bords dans le reste du programme.
sub
calcul{ Ou sub
calcul {
my $argument1 = $_[0]; my
@argument = @_ ;
my $argument2 = $_[1]; }
}
VII.2 Quelques
fonctions systèmes utiles
1. chdir
Permet un changement de
répertoire.
Renvoie vrai si le changement
s'est bien passé.
*Syntaxe
chdir($chemin);
2. chmod
Permet de modifier les droits
sur un ou plusieurs fichiers ou un ou plusieurs répertoires.
La valeur de retour de la
commande est le nombre de modifications effectuées.
*Syntaxe
chmod($droits,$fichier1,$fichier2, ...);
$droit est en octal 0777 donnera tous les droits a
tout le monde
On peut modifier plusieurs
fichiers en utilisant une expression :
chmod(0777,<*.o>);
changera les droits a tous les fichiers ayant l'extension .o
3. chop
Ce mot clé permet de
supprimer le dernier caractère contenu dans une variable. Il est notamment très
utile pour supprimer le retour chariot
lors de la lecture au clavier
des données :
*Syntaxe
chop($variable);
4. chomp
Ce mot clé permet de
supprimer les derniers caractères situés derrière le caractère \ en fin de
variable. Il ressemble beaucoup à chop, mais permet de faire cette action sur
des listes et non pas seulement sur des chaînes simples.
*Syntaxe
chomp($variable1, $variable2,..., @liste1,@liste2,...);
5. chown
Permet de modifier le
propriétaire d'un fichier ou d'un répertoire.
Pour l'utiliser il vous faut
avoir des droits particuliers la plupart du temps.
La valeur de retour de la
commande est le nombre de modifications effectuées.
*Syntaxe
chown($uid,$gid,$fichier1,$fichier2,..);
$uid est le numéro d'identification de
l'utilisateur
$gid est le numéro d'identification du groupe
6. closedir
Ferme un descripteur de
répertoire.
*Syntaxe
closedir(descripteur);
voir aussi opendir, readdir
7. delete
Détruit un couple de valeur
dans un tableau associatif.
*Syntaxe
delete($tab{$cle});
8. die
Permet de terminer un
programme au moment ou on passe sur le die et de faire une sortie écran au même
moment.
*Syntaxe
die "c'est la fin\n";
9. each
Renvoie chaque éléments du
tableau associatif.
Voir l’exemple avec la boucle
while.
*Syntaxe
($cle,$val)=each(%tab);
10. eof
Permet de déterminer si la
fin du fichier est atteinte.
*Syntaxe
eof(descripteur); # renverra
la valeur vraie si la fin est atteinte
#
à utiliser avec une boucle while par exemple
11. exists
Permet de déterminer
directement si un couple (cle,valeur) existe dans le hachage. Si le couple
existe, la valeur vraie est retournée.
*Syntaxe
exists $hachage{$cle};
12. getc
Permet de récupérer un seul
caractère lors de la lecture d’un fichier ou d’une saisie au clavier. Pour un
fichier, faites une boucle de lecture avec un while par exemple.
Si vous ne précisez pas de
descripteur de fichier, la lecture se fera sur l’entrée standard.
*Syntaxe
$c = getc(Descripteur);
*Exemple
while($c = getc(Descripteur))
{
print
“Caractère lu : $c\n”;
}
13. glob
Renvoie le fichier dont le
nom est indiqué en argument de la fonction glob.
Les caractères de
substitution sont autorisés (*, ? ).
Si vous n’indiquez pas de
chemin de recherche, cette dernière se fera à l’endroit où vous êtes.
Si il y a plusieurs fichiers
ayant la chaîne de recherche dans leur nom, seul le premier sera renvoyé. Pour
obtenir tous les noms créez un boucle.
*Syntaxe
$recherche = glob(“chaine”);
*Exemple
while($recherche = glob(“/usr/local/bin/perl*”))
{
print
“$recherche”;
}
Vous obtiendrez tous les noms
des fichiers commençant par la chaîne perl se trouvant dans le répertoire /usr/local/bin.
14. grep
Effectue une recherche dans
tous les éléments d’une ou plusieurs listes en fonction d’une expression
régulière indiquée en argument de la fonction.
Les valeurs retournées sont
celles des éléments qui satisfont à cette recherche.
Elles sont stockées dans un
tableau.
*Syntaxe
@resultat = grep(expression,liste1, liste2 ...
listen);
*Exemple
@liste1=(“klm”,”mnop”,”xyz”,”12çà”);
@liste2=(“piste”,”poire”,”miam”,”beurk”);
@resultat = grep(/m/,@liste1,@liste2) ;
print “resultat”;
On recherche tous les éléments
des listes contenant le caractère m.
Affichera les éléments klm,mnop et miam.
Toutes les expressions
régulières sont possibles.
15. index
Renvoie l'emplacement d'une
sous-chaîne de caractères dans la chaîne indiquée ou -1 si cette sous-chaîne
n'existe pas.
Attention les indices
commencent à l'indice 0.
La chaîne est parcourue par
la gauche.
Le paramètre $position permet
de faire un recherche à partir d'un indice précis.
*Syntaxe
index($chaine,$sous-chaine);
ou
index($chaine,$sous-chaine,$position);
16. join
Cancantène une valeur à
chaque élément d'une liste et range le tout dans une variable.
*Syntaxe
join($valeur,@liste);
17. keys
Permet de récupérer dans un
tableau associatif la clé ou les clés dans un ordre quelconque afin de trouver
ensuite la donnée qui lui est associée. Keys renvoie vide si le tableau est
vide.
*Syntaxe
keys(%tableau)
*Exemple
foreach $cle (keys %tableau)
{
$donnee = %tableau{$cle};
print "la donnée $donnee est associée a la clé $cle\n";
}
18. last
Permet de sortir d'une boucle
avant la fin normale de celle-ci comme break en C par exemple.
Un label peut lui être
associe afin de continuer l’exécution du programme à un endroit particulier.
*Syntaxe
last ou last LABEL;
19. length
Renvoie le nombre de
caractères de la chaîne.
*Syntaxe
length(chaine);
20. link
Crée un lien en dur entre
deux fichiers (équivalent a ln)
*Syntaxe
link($fichierorigine,$fichierlien);
21. lstat
Renvoie 13 champs
d'informations concernant le lien symbolique et non sur le fichier pointé.
*Syntaxe
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
$blksize,$blocks) = lstat($fichier);
22. mkdir
Crée un répertoire.
*Syntaxe
mkdir($repertoire,$droit);
23. next
Permet de passer au traitement
de l'élément suivant dans une boucle et d'abandonner le traitement de l'élément
en cours.
Un label peut lui être
associe afin de continuer l’exécution du programme à un endroit particulier.
*Syntaxe
next ou next LABEL;
24. opendir
Ouvre un descripteur de
répertoire.
*Syntaxe
opendir(descripteur,$repertoire);
voir closedir, readdir
25 pack
Convertit une chaîne ou
plusieurs chaînes en une structure binaire selon le modèle indiqué. Ce modèle
est précisé grâce à une liste de « patron » représentée par des
séquences de caractères.
Le résultat est une chaîne de
caractères.
*Syntaxe
$chaine = pack(“patron”,$chaine1,$chaine2 ...
$chainen) ;
*Exemple
L’exemple utile lorsqu’on
traite des résultats de formulaires sur l’internet est la ligne suivante. Elle
enchaîne plusieurs opérateurs, elle n’est pas triviale donc ne réinventez pas
la roue utilisez là J. Elle permet de modifier
les caractères accentués pour les rendre lisibles sur votre machine en une
seule passe.
$buffer =~ s/%(..)/pack(“c”,hex($1))/ge;
voir aussi la fonction
inverse unpack
26. pop
Retire le dernier élément de
la liste (à droite).
La valeur de retour est
l'élément supprimé.
*Syntaxe
pop(@liste)
voir aussi push
27. push
Ajoute un élément ou
plusieurs en fin de liste (à droite).
*Syntaxe
push(@liste,$elemt1,$elemt2,...) <=>
@liste=(@liste,$elemt1,$elemt2,...)
voir aussi pop
28. rand
Renvoie une valeur aléatoire
comprise entre 0 et 1 si aucune valeur maximale n’est indiquée et entre 0 et la
valeur maximale indiquée.
Il est conseillé
d’initialiser l’utilisation de rand afin de ne pas avoir des valeurs qui
reviennent de manière identiques lors de différents lancement de votre
programme. Pour cela utilisez srand avec une expression non triviale.
Par défaut l’initialisation
se fera en utilisant la fonction time en argument de srand.
*Syntaxe
$aleatoire = rand(nombre) ;
*exemple
$aleatoire = rand 10; # nombre compris entre 0 et
10
29. readdir
Liste le contenu du
répertoire pointé par le descripteur ouvert par opendir.
*Syntaxe
readdir(descripteur);
voir aussi opendir, closedir
30. readlink
Donne les renseignements sur
le fichier lié par la commande symlink (équivalent à ls -l).
*Syntaxe
readlink($fichier);
31. redo
Permet de recommencer le
traitement de l'élément en cours sans effectuer le traitement après le redo.
Un label peut lui être
associe afin de continuer l’exécution du programme à un endroit particulier.
*Syntaxe
redo ou redo LABEL;
32. rename
Permet de renommer un fichier
sous un autre nom.
*Syntaxe
rename($fichier,"$autre_nom");
33. reverse
Inverse le sens de la liste.
*Syntaxe
@liste_inversee=reverse(@liste)
34. rindex
Renvoie l'emplacement d'une
sous-chaine de caractères dans la chaîne indiquée ou -1 si cette sous-chaine
n'existe pas.
Attention les indices
commencent à l'indice 0.
La chaîne est parcourue par
la droite.
Le paramètre $position permet
de faire un recherche à partir d'un indice précis.
*Syntaxe
rindex($chaine,$sous-chaine);
ou
rindex($chaine,$sous-chaine,$position);
35. rmdir
Détruit un répertoire
*Syntaxe
rmdir($repertoire);
36. shift
Retire le premier élément de
la liste (a gauche).
La valeur de retour est
l'élément supprimé.
*Syntaxe
shift(@liste)
voir aussi unshift
37. sleep
Suspend le déroulement du
programme durant le laps de temps indiqué.
*Syntaxe
sleep secondes;
38. sort
Trie les éléments par ordre
alphabétique.
*Syntaxe :
@liste_trie=sort(@liste)
39. split
Découpe et range dans une
liste les éléments trouvés contenus entre un délimiteur défini.
*Syntaxe
split(delimiteur,$variable);
*Exemple
$a = "1:2:3:4::5";
@liste = split(/:/,$a); ->
("1,"2","3","4","","5")
40. sprintf
Permet de formater une
sortie.
*Syntaxe
sprintf(format,variables);
*Exemple
$res = sprintf("Pour la sortie du film
%s\n",$nom);
41. srand
Permet d’initialiser le
tirage aléatoire de nombres avec la fonction rand.
Plus l’expression a de chance
de donner un résultat différent à chaque lancement de la fonction, plus le
tirage sera aléatoire dans le temps.
*Syntaxe
srand(expression);
42. stat
Renvoie 13 champs
d'informations concernant un fichier.
*Syntaxe
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,
$blocks) = stat($fichier);
43. substr
Permet d'extraire et de
substituer une sous-chaine d'une chaîne.
Si la valeur de $depart est
négative, la substitution se fera par la droite (fin de la chaîne).
Si la chaîne résultat est à
gauche, le résultat du substr sera stockée dans cette chaîne. Si la chaîne
résultat est à droite, cette chaîne devient la chaîne de substitution et
remplacera les éléments sélectionnés. La longueur de cette chaîne peut être
inférieure ou supérieure à la longueur de substitution, la chaîne résultat sera
d'autant plus courte ou plus longue.
*Syntaxe
$subst = substr($chaine,$depart,$longueur);
ou
substr($chaine,$depart,$longueur)= $rempl;
44. symlink
Crée un lien symbolique entre
deux fichiers (équivalent a ln -s)
*Syntaxe
symlink($fichierorigine,$fichierlien);
45. system
Réalise des appels système.
*Syntaxe
system("appel"); ou system(@liste);
La deuxième syntaxe est à
privilégier, perl effectuant alors un contrôle sur la validité de la liste.
Cela peut éviter des erreurs dramatiques.
46. time
Renvoie l'heure système qui
est le nombre de secondes écoulées depuis le 1er Janvier 1970 à minuit GMT.
Pour obtenir un écart en
heure entre deux heures :
($time1 - $time2)/3600
*Syntaxe
time();
47. tr
Comme en shell cette commande
permet de transformer une chaîne en une autre chaîne ou de modifier des
occurrences dans une chaîne.
*Syntaxe
Voir le man tr
*Exemple
$name =~ tr/A-Z/a-z/; # Transforme toutes les
majuscules en minuscules
$name =~ tr/er/ab/; # Transforme les e en a et les r en b
48. undef
Définie la chaîne vide. Avant
toutes opérations, une chaîne à cette valeur.
49. unlink
Détruit un ou plusieurs
fichiers.
*Syntaxe
unlink($fic1,fic2,...);
Il est possible de détruire
plusieurs fichiers en utilisant une expression :
unlink(<*.o>); détruira
tous les fichiers ayant une extension .o
Le < et le > permettent
d'inhiber le caractère spécial *
50. unshift
Ajoute un élément ou
plusieurs en début de liste (a gauche).
*Syntaxe
unshift(@liste,$elemt1,$elemt2,...) <=>
@liste=($elemt1,$elemt2,.,@liste)
Voir aussi shift
51. utime
Permet de changer la date des
fichiers ou répertoires au niveau de la date de dernière modification et de la
date de dernier changement de l'inode.
La valeur de retour de la
commande est le nombre de modifications effectuées.
*Syntaxe
utime($date_modification,$date_inode,$fichier1,$fichier2,..);
52. values
Renvoie les valeurs contenues
dans un tableau associatif.
*Syntaxe
values(%tab);
VIII Autres éléments du langage
VIII.1 Les paquetages
1. Présentation
Cette fonctionnalité proposée
par Perl n’est pas forcément très utile pour des programmeur de base mais il
faut la connaître pour de ne pas mourir idiot.
Faites attention, cela peut
arriver n’importe quand et n’importe où. Imaginez, vous faites du quad, ou
passez en camion sur les rails de chemin de fer en Amériques ... On sait
jamais L.
Plus sérieusement c’est quoi
un paquetage ?
En anglais l’appellation est
package. Ceux qui ont déjà programmés en langage orienté objets (Ada, C++ ...)
doivent mieux voir de quoi je parle.
Imaginez que vous ayez déjà
réalisé(e)s plusieurs programmes perl contenus dans des fichiers différents.
Vous êtes en cours de réalisation d’un nouveau et vous vous rendez compte que
plusieurs portions de codes pourraient être récupérées dans les fichiers
précédents, vous évitant ainsi de devoir réécrire des parties existantes.
Problèmes rien ne dit que les
variables sont toutes différentes, que des fonctions n’ont pas le même nom ...
Si cela fait 5 lignes ce n’est pas complexe à vérifier mais si c’est beaucoup
plus important, la galère.
Par chance vous pouvez alors
créer des paquetages. Tout ce qui est dans un paquetage n’a de valeur qu’à
l’intérieur de celui-ci. Si vous devez utiliser une variable ou une fonction de
ce paquetage il faudra alors la préfixer par le nom du paquetage selon une
syntaxe précise.
Pour bien se représenter la
chose imaginez que vous habitez une superbe maison dans un superbe ...
lotissement comme l’un des suivants :
Vous invitez chez vous des
amis, comment vont ils retrouver votre maison ?
äFacile c’est une maison avec un étage et un jardin de
2 mètres carré.
âEuh t’es gentil il y en a au moins 30 milles comme ça.
Elles se ressemblent toutes, à quelque chose prêt.
äElle a le numéro 44
âSuper une maison avec un étage, 2 mètres carré d’herbe
qui porte le numéro 44. Ca va être facile à trouver il y en a au moins 500 qui
ont cette caractéristique.
Donnes moi une indication qui
me permettra de la trouver sans possibilité d’erreur !
äElle est rue de la solitude.
âEh bien voilà c’est mieux ý rue de la solitude : : maison 44.
Bon reste plus qu’à trouver
cette ghi¦W de rue de la solitude. Non vraiment chouette le coin je
t’assure j’aime beaucoup !
Pour replacer le tout dans le
contexte des paquetages, la maison 44 serait la variable ou la fonction et le
nom de la rue le paquetage. Pour identifier la maison, vous la préfixez par le
nom de la rue. Pour identifier la variable, vous la préfixez par le nom du
paquetage.
Un autre exemple pris pour la
compréhension est celui des fichiers et des répertoires. Vous pouvez avoir deux
fichiers portant le même nom dans deux répertoires différents. Pour
l’identifier de manière sure vous direz répertoire/fichier. Le fichier est la
variable, le répertoire le paquetage seul le séparateur change c’est un ::
et non un / (sous unix).
2. Syntaxe
Le mot clé a utiliser est
package.
package
nom;
variables, fonctions et actions de ce paquetage
3. Exemples
Exemple avec une variable
identique.
package Programme1;
$chaine = "Frédéric";
package Programme2;
$chaine = "Jacquenod";
package Main;
$a = $Programme1::chaine;
$b = $Programme2::chaine;
print "$a $b\n";
Tout se qui se situe entre
deux opérateurs package fait partie du premier package.
La syntaxe avec des fonctions
est un peu différente.
Prenons l’exemple de deux
paquetages Programme1 et Programme2 ayant chacune une fonction multiplication à
laquelle on doit passer une valeur à multiplier. La première multiplie par 2 et
la deuxième par 3.
L’appel dans le paquetage
principal Main se fera de la façon suivante :
$a = Programme1->multiplication(5); # vaut 10
$b = Programme2->multiplication(5); # vaut 15
Nous le verrons complètement
avec les exemples durant le cours.
VIII.2 Les modules
1. Présentation
Vous avez un certains nombres
de fonctions, de déclarations, ..., que vous réutilisez souvent dans vos
programmes.
Des fonctions peuvent
intéresser d’autres programmeurs Perl, leurs évitant ainsi de devoir réécrire
et de récréer des morceaux de codes existants. Même chose pour vous, si vous
devez utiliser une fonction calculant des cosinus, travaillant sur des bases de
données, autant réutiliser des fonctions déjà crée et disponible plutôt que
perdre du temps à réinventer la roue.
Ces fichiers ont pour
nom : module.
Un module est un ensemble de
fonctions, de procédures ayant un rapport entre elles (fonctions mathématiques,
accès à des bases de données, gestion des sockets pour les accès réseau ...).
Elles sont contenues dans un paquetage. Le nom du fichier contenant le tout
possède l’extension .pm. Ce nom de fichier
aura le nom du paquetage.
Le fichier contenant le
module se termine par 1; .
La distribution perl que vous
installez possède déjà un grand nombre de modules qui se situe notamment dans
les répertoires lib, ext ... de votre installation.
Rien ne vous empêche d’en
installer autre part, il faudra juste le signifier
lors de l’appel dans votre
programme perl.
Vous trouverez un grand
nombre de modules sur le site du CPAN.
Le répertoire by-category est
rangé par type de modules. Modules orientés vers le web, vers la sécurité ...
Récupérez le module voulu, installez le dans un répertoire visible de Perl
(voir liste @INC) et vous pourrez ensuite l’utiliser.
2. Syntaxe
*Exemple
Le module integer se situe
dans un fichier nommé integer.pm
package integer;
sub import {
$^H |= 1;
}
sub unimport {
$^H &= ~1;
}
1;
Le fait de déclarer un
paquetage lors de la création d’un module permet d’éviter les effets de port
lorsque le module sera importé dans le programme (Voir les paquetages).
3. Utilisation d’un module
Lorsque vous désirez utiliser
un module, vous devez le signifier au départ dans votre programme perl au moyen
des mots clés require ou use.
Le mot clé require charge le
module à l’exécution de votre programme tandis que le mot clé use le charge dès
la compilation. Les instructions suivantes sont équivalentes.
use Nom; begin
{
Û require
Nom;
import
Nom;
}
Il est donc préférable
d’utiliser le mot clé use si le module doit être chargé. Par contre si le
module ne doit être chargé que sous certaines conditions, il n’est pas
nécessaire de le charger dès la compilation, préférez alors require et import
pour le chargement.
Les répertoires par défaut
dans lesquels se situent les modules sont contenus dans la variable @INC. Si un
module à charger s’y trouve, il suffit de mettre la ligne suivante :
require Nom; #
Nom est le nom du module et du fichier qui a
#
l’extension .pm se trouvant dans un des
#
répertoire contenu dans la variable @INC
ou
require ”Nom.pm”; #
Nom.pm est le nom du fichier se trouvant dans un des
#
répertoire contenu dans la variable @INC
ou
use Nom;
Si le module est mis dans un
sous-répertoire de l’arborescence indiquée dans @INC. Ce module contiendra le
paquetage Rep::Nom (package Rep::Nom ;).
L’appel dans votre programme
devra le spécifier.
require Rep::Nom; #
Nom est le nom du module et du fichier qui a
#
l’extension .pm se trouvant dans
#
un sous-répertoire d’un des
répertoires contenu
#
dans la variable @INC
ou
require ”Rep/Nom.pm”; # Nom.pm est le nom
du fichier se trouvant dans
#
un sous-répertoire d’un des
répertoires contenu
#
dans la variable @INC
ou
use Rep::Nom;
Si le module est dans un
autre répertoire non défini dans la liste @INC, indiquez le chemin absolu.
use ”/usr/local/module-perl/Rep/Nom.pm ”;