Le langage Perl
Marie-pascale Delamare toujours depuis la même URL
Présentation
#!/bin/perl
print "Bonjour";
Chaque instruction Perl se termine par un point-virgule. La ligne # !/bin/perl indique où se situe l’interpréteur perl.
Marie-pascale Delamare toujours depuis la même URL
Déclarer ses variables ou scalaires
Les scalaires sont précédés du caractère $
my $i = 0; my $c = 'a';
my $mon_fruit_prefere = 'kiwi';
my $racine_carree_de_2 = 1.41421;
my $chaine = '100 grammes de mon_fruit_prefere'; => '100 grammes de $mon_fruit_prefere'
my $chaine = "100 grammes de mon_fruit_prefere"; => '100 grammes de kiwi'
Marie-pascale Delamare toujours depuis la même URL
Déclarer et utiliser ses tableaux
Toujours précédés du caractère « @ »
my @chiffres = (1,2,3,4,5,6,7,8,9,0);
my @alphabet = ('a'..'z'); Les deux points
signifient de "tant à tant"
my @cartes = ('01'..'10','Valet','Dame','Roi');
on fait référence à un élément du tableau selon son indice par :
$chiffres[1] ; (=> 2)
$alphabet[0] ; (=> 'a') Marie-pascale Delamare toujours depuis la même URL
Les opérateurs
$a = 1; $b = $a ;
$c = 53 + 5 - 2*4 ;
Plusieurs notations pour incrémenter une
variable
$a = $a + 1; ou $a += 1; $a++;
$c = 'ce' . 'rise'; (=> $c devient 'cerise')
$x = 2 * (56 - 78);
Marie-pascale Delamare toujours depuis la même URL
Les comparaisons
de chiffres
>, >=, <, <=, ==, !=
Attention : = est une affectation, == est une comparaison if ($a = 2) => sera toujours vrai !
de chaînes
gt, ge, lt, le, eq, ne
Attention : Ne pas confondre la comparaison de chaînes et d'entiers 'b' == 'a' => évalué comme étant vrai ! Il faut écrire : 'b' eq 'a' => évalué faux bien sûr.
Marie-pascale Delamare toujours depuis la même URL
Syntaxe générale
my $a = 'a'
print $a;
Ce programme est erroné !
my $a = 'Une très longue chaîne de caractère qui ne peut s'écrire sur une seule ligne';
Ok !
Les commentaires commencent par un #.
# voici un commentaire
my $a = 3; # Et en voici un autre
Marie-pascale Delamare toujours depuis la même URL
Les structures
L’alternative ;
if
Les boucles ;
for, while, foreach.
Marie-pascale Delamare toujours depuis la même URL
L’alternative
if (expression) {
bloc;
}
if ($prix[1] > 20) {
print 'Les dattes sont un peu chères...';
print 'Achetons plutôt des cerises';
}
Marie-pascale Delamare toujours depuis la même URL
L’alternative
if (expression) {
bloc;
} else {
bloc2;
}
if ($fruit eq 'fraise') {
print 'parfait !';
} else {
print 'Bof !';
print 'Je préfère sans pépin';
} Marie-pascale Delamare
toujours depuis la même URL
L’alternative
Le traitement d'une réponse de type (Oui/Non) :
en fait, on teste que la réponse commence par
"O"
print 'Etes-vous d\'accord ? ';
my $reponse = <STDIN>;
if ($reponse =~ /^O/i) { # commence par O
(minus. ou majus.)
print "Alors on continue";
} Marie-pascale Delamare
toujours depuis la même URL
Les boucles
for (init;condition;cmd) {
bloc;
}
for (my $i=0; $i <= $#fruit; $i++) {
print $fruit[$i];
}
Marie-pascale Delamare toujours depuis la même URL
Les boucles
while (expression) {
bloc;
}
my $mon_argent = $porte_monnaie;
while ($mon_argent > $prix[2]) {
$mon_argent -= $prix[2];
# ou $mon_argent = $mon_argent - $prix[2]
print "Et un kilo de cerises !";
}
Marie-pascale Delamare toujours depuis la même URL
Les boucles
foreach élément (tableau) {
bloc;
}
foreach my $f (@fruits) {
print $f;
}
Marie-pascale Delamare toujours depuis la même URL
Quelques fonctions intéressantes
print : permet d'afficher un message, ou le contenu de variables.
print 'J\'ai acheté ', $nombre,' kilos de ', $fruit;
exit : permet d'arrêter le programme en cours
if ($erreur) {exit;}
die : permet d'arrêter le programme en cours en affichant un message d'erreur.
if ($fruit eq 'orange') {die 'Je déteste les oranges !'}
system : permet de lancer une commande système
system 'mkdir mon_repertoire';
Marie-pascale Delamare toujours depuis la même URL
Quelques fonctions intéressantes
Sur les chaînes de caractères
split('motif', ch) Sépare la chaîne en plusieurs éléments (le séparateur étant motif).
Le résultat est un tableau. (Fonction très utilisée pour l’analyse de fichiers)
@t = split(' / ', 'amande / fraise / cerise');=> ('amande','fraise', 'cerise')
Sur les tableaux
grep(/expression/, tableau) Recherche d'une expression dans un
tableau
if (grep(/poivron/, @fruits)); => faux
if (grep(/$f/, @fruits) {print 'fruit connu';}
grep retourne un tableau des éléments trouvés :
@f = grep(/ise$/, @fruits); => fraise;cerise Marie-pascale Delamare toujours depuis la même URL
La gestion des fichiers
open (F, « < $fichier ») || die "Problème
pour ouvrir $fichier: $!";
while (my $ligne = <F>) {
print $ligne;
}
close F;
Marie-pascale Delamare toujours depuis la même URL
La gestion des fichiers : quelques particularités
$reponse = <STDIN>; => lecture d'une ligne à l'écran
@lignes = <FENT>; => lecture de tout le fichier dans un tableau
print STDOUT "Bonjour\n"; => sortie standard (l’écran)
print STDERR 'Je déteste les oranges !'; => sortie standard pour les erreurs (l’écran)
Marie-pascale Delamare toujours depuis la même URL
Les variables et tableaux spéciaux
$_ La dernière ligne lue (au sein d’une boucle « while »)
$! La dernière erreur, utilisée dans les détections
d’erreurs
$$ Le numéro système du programme en cours: parfois
utile car il change à chaque fois
$0 Le nom du programme (à utiliser, cela vous évitera
de modifier le programme s’il change de nom)
@ARGV tableau qui contient les paramètres passés au
programme
%ENV tableau indicé contenant toutes les variables
d'environnement
Marie-pascale Delamare
toujours depuis la même URL
Passer des paramètres au programme
#!/bin/perl
use strict;
my $email = $ARGV[0];
open (MAIL, "| mail -s 'Bonjour' $email") || die "Problème : $!";
print MAIL "Bonjour très cher\n";
print MAIL "Nous sommes très heureux de vous envoyer un mail\n"
print MAIL " A bientôt\n"
close MAIL;
Appel : nomDuScript.pl [email protected]
Marie-pascale Delamare toujours depuis la même URL
Accès aux bases de données
#!/bin/perl
use strict;
use DBI; # On va utiliser la base de données
my $dbh = DBI->connect('dbi:Oracle:cours', 'scott','tiger');
# Préparation d'une requête de sélection des valeurs
my $sel = $dbh->prepare('select * from mpatient');
$sel->execute || die "Pb à la sélection : $DBI::errstr";
print "Voici la liste des patients enregistrés";
while (my ($nopatient, $nom, $prenom) = $sel->fetchrow_array) {
# Pour chaque ligne lue...
print "Patient no $nopatient : $nom, $prenom\n";
}
$sel->finish; # On ferme la requête insert
$dbh->disconnect; # Déconnexion de la BDD
Marie-pascale Delamare
toujours depuis la même URL
Accès aux bases de données
Ne pas oublier le use DBI
Gérer sa connexion à la base de données
Préparer sa requête
Exécuter sa requête
Exploiter le résultat
Terminer le traitement de la requête
Se déconnecter de la base de données
Marie-pascale Delamare toujours depuis la même URL