Dernière version sur https://formation-perl.fr/guide-perl.html
© 2002-2024 Sylvain Lhullier - Permission est accordée de copier et distribuer ce document sans modification
et à condition de fournir un lien vers la page https://formation-perl.fr/guide-perl.html
Envie d'une formation Perl ?
Sylvain Lhullier propose des formations au langage Perl,
contactez-le.
Il existe principalement deux types de langages : les langages compilés
et les langages interprétés. Pour les premiers (on retrouve par exemple
dans cette catégorie le C et le C++), il existe deux phases distinctes :
la compilation des sources par un compilateur (gcc
par
exemple) puis l'exécution du programme ainsi obtenu par le système.
Pour les seconds (les shells par exemple), il n'y a pas de phase de
compilation, un interpréteur va lire le code et directement agir en fonction
de celui-ci.
Perl est un langage à la fois interprété et compilé. Il n'y a pas de phase
intermédiaire de compilation, car l'interpréteur (qui se nomme
perl
en minuscules, alors que le langage prend une
majuscule) compile le code sans que le programmeur ne s'en rende compte,
puis l'exécute.
L'interpréteur se charge donc à la fois de la compilation et de l'exécution.
Il existe trois façons distinctes de faire tourner un programme Perl :
mettre du code en ligne de commande. On peut écrire ceci dans un shell :
perl -e 'print("Salut Larry\n");'
Le programme perl
est lancé avec du code Perl comme
argument, directement sur la ligne de commande (option -e
).
En anglais, on appelle cela un one-liner (pas de traduction établie en français,
peut-être monoligne, uniligne, soliligne...). Le code sera alors exécuté :
la fonction print
affiche son argument.
Salut Larry
Ce n'est pas la façon la plus courante d'écrire du Perl, mais c'est une manière facile et rapide de faire un petit calcul ou de faire appel à une fonction Perl.
la seconde manière de faire est de créer un fichier salut.pl
contenant :
print("Salut Larry\n");
Puis de lancer la commande suivante depuis un shell :
perl salut.pl
Le programme perl
est lancé avec le nom du fichier
en argument. Il va alors lire le contenu de ce fichier et l'interpréter
comme du code Perl ;
la troisième façon de faire est de créer un fichier salut2.pl
contenant :
#!/usr/bin/perl use strict; use warnings; print("Salut Larry\n");
La première ligne est le shebang, bien connu
des habitués des scripts en shell. Cette ligne (qui doit toujours
être la première du fichier) indique au système d'exploitation le
chemin de l'exécutable à lancer pour interpréter ce fichier.
Le premier caractère doit être un dièse, ce qui a pour effet que cette
ligne est considérée comme un commentaire Perl par l'interpréteur.
Ensuite un point d'exclamation. Puis le chemin absolu
vers l'exécutable perl
(à adapter selon votre installation,
voir ce que répond type perl
ou which perl
).
Les deux lignes suivantes sont des pragma qui rendent le langage moins permissif.
Le pragma use strict;
permet de rendre le langage moins
permissif, notamment en nous obligeant à déclarer nos variables. Je vous conseille
de toujours utiliser ce pragma.
Le pragma use warnings;
est positionné dans le but que l'interpréteur affiche des
messages d'avertissement (warnings) à différents propos : il indique les
variables utilisées une seule fois ou utilisées avant d'être
initialisées, il signale les redéfinitions de fonctions, etc.
Je vous conseille donc de toujours utiliser ce pragma.
Il faut maintenant rendre ce fichier exécutable et le lancer :
chmod +x salut2.pl ./salut2.pl
Grâce à la ligne de shebang, le système le reconnaît donc comme un programme nécessitant un interpréteur pour être exécuté. Cet interpréteur est lancé avec pour paramètres les options fournies dans le shebang ainsi que le nom du fichier.
Cette dernière façon de faire est sans doute la plus courante dès que l'on écrit un programme qui sera utilisé plusieurs fois.
Avant de continuer, quelques commentaires sur la syntaxe Perl. Excepté dans les chaînes de caractères, la présence ou l'absence d'espaces, de sauts de ligne ou de tabulations ne change pas le comportement du programme, l'indentation est libre. Comme on vient de le voir, une instruction Perl est terminée par un point-virgule. Les fonctions peuvent prendre leurs arguments entre parenthèses (comme en C) ; il faut aussi savoir que l'on peut se passer de ces parenthèses. On aurait pu écrire :
print "Salut Larry\n";
Les deux syntaxes sont tout à fait valides. Dans les cas simples (appel d'une fonction avec un ou deux paramètres), on pourra omettre les parenthèses. Dans le cas de combinaisons plus complexes (plusieurs fonctions appelées en paramètre d'autres fonctions, listes en argument...), je vous conseille de les mettre pour lever toute ambiguïté possible.
Un commentaire commence par un dièse (#
)
et se termine en fin de ligne (comme en shell). On constitue un bloc d'instructions
en les regroupant dans des accolades {}
comme en C.
Des exemples suivront.
Perl est un langage faiblement typé, ce qui signifie qu'une donnée n'aura pas spécialement de type : les nombres, les chaînes de caractères, les booléens, etc. seront tous des scalaires et ne seront différenciés que par leur valeur et par le contexte de leur utilisation.
Il existe principalement trois structures de données : les scalaires, les tableaux et les tables de hachage. Chaque structure de données est liée à un caractère spécial (lire la suite).
Un scalaire est une donnée atomique. Par exemple, ce pourrait être une
chaîne de caractères (suite de caractères) ou un nombre (entier ou flottant).
On verra plus tard que les références (c'est-à-dire les pointeurs de
Perl) sont des scalaires, même s'ils sont un peu spéciaux.
Les variables scalaires sont précédées d'un dollar ($
) :
$x
est donc une variable scalaire.
Les tableaux permettent de stocker plusieurs scalaires en les indiçant.
De la même façon qu'en C, on pourra demander le ième élément d'un
tableau, i étant un entier. L'accès à un élément sera en temps
constant, il ne dépendra pas de son indice dans le tableau.
Les variables de type tableau sont précédées d'une arobase
(@
) : @t
est donc une variable de type tableau. Lorsque l'on utilise la
syntaxe @t
, on désigne la totalité du tableau ;
si nous voulons parler du ième élément, nous allons manipuler
un scalaire, il faudra donc préfixer par un dollar : $t[4]
est l'élément d'indice 4 dans le tableau @t
,
les crochets []
délimitant l'indice
(nul besoin de mettre l'arobase, Perl sait grâce aux crochets qu'il
s'agit d'un élément de tableau).
Une table de hachage en Perl est une structure de données permettant
d'associer une chaîne de caractères à un scalaire ; on parle de clefs et de valeurs :
une valeur est associée à une clef. Naturellement, dans une même
table de hachage les clefs sont uniques ; les valeurs, par contre,
peuvent être tout à fait quelconques. Les variables de type table de hachage
sont précédées d'un caractère pourcent (%
) : %h
est donc une variable de type table de hachage. De la même façon que
pour les tableaux, %h
représente la totalité de la table de hachage ;
accéder à un élément se fera avec un dollar : $h{uneclef}
est l'élément de clef uneclef
de la table de hachage %h
,
les accolades {}
délimitant la clef.
Fonctionnellement, on pourrait voir une table de hachage comme un tableau
dont les indices peuvent être non numériques.
Nous reviendrons sur ces types de données tout au long du document.
Chaque opération en Perl est évaluée dans un contexte spécifique. La façon dont l'opération se comportera peut dépendre de ce contexte. Il peut jouer un rôle important sur le type des opérandes d'une expression et/ou sur le type de sa valeur. Il existe deux contextes principaux : le contexte scalaire et le contexte de liste.
Par exemple, une affectation d'une expression à une variable de type scalaire évaluera cette expression dans un contexte scalaire ; de la même façon, une affectation à une variable de type liste évaluera le membre droit en contexte de liste. Autre exemple que je détaillerai un peu plus loin, les opérateurs de test imposent un contexte précis à leurs opérandes.
Certains opérateurs et fonctions savent dans quel contexte ils sont appelés
et renvoient un scalaire ou une liste selon ce contexte d'appel.
La fonction grep
en est un bon exemple (nous verrons
cela lorsque nous parlerons des listes).
On peut forcer le contexte d'une expression au contexte scalaire
en utilisant l'opérateur scalar()
.
Il existe plusieurs contextes scalaires : le contexte de chaînes de caractères, le contexte numérique et le contexte tolérant. Par exemple une addition impose un contexte numérique à ses deux opérandes ; cela signifie que les opérandes sont transformés en nombres, quels que soient leur type et leur valeur (reste ensuite au programmeur à savoir ce que vaut une liste ou une chaîne quelconque en contexte scalaire...). Le contexte de chaînes est un contexte où, comme son nom l'indique, les scalaires seront considérés comme des chaînes de caractères. Le contexte tolérant n'est ni de chaînes ni numérique, il est simplement scalaire.
Il existe aussi un contexte vide (void context in English)
qui correspond au fait que la valeur d'une expression est ignorée.
C'est par exemple le contexte utilisé lorsque l'on appelle une fonction
sans récupérer sa valeur de retour, comme l'appel à la fonction
print
dans la section précédente.
Ce contexte n'apporte pas grand chose au programmeur, mais permet
à l'interpréteur Perl appelé avec use warnings;
de prévenir en cas d'usage d'une expression sans effet de bord
en contexte vide (c'est-à-dire une expression qui ne fait rien et dont on ne
se sert pas). Par exemple, la ligne d'instructions suivante :
"Bonjour";
provoque le message suivant :
Useless use of a constant in void context at prog.pl line 5.
Vous aurez l'occasion de manipuler les contextes tout au long de cette introduction au langage. Même si cela n'est pas forcément explicite à chaque instant, le contexte est souvent important.