licence informatique - semestre 5 - univ-st-etienne.fr · plan du cours 1 introduction générale 2...
TRANSCRIPT
-
La programmation en Perl
Jean-Philippe Peyrache
Université Jean Monnet - Faculté des Sciences et Techniques
Licence Informatique - Semestre 5
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 1 / 67
-
Plan du cours
1 Introduction générale
2 Les variables scalaires
3 Autres types de variables
4 Conditionnelles et boucles
5 Les expressions régulières
6 Travailler avec des entrées/sorties
7 Divers
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 2 / 67
-
Introduction générale
Introduction générale
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 3 / 67
-
Introduction générale
Le langage Perl
Le langage Perl a pour but de simplifier la mise en oeuvre des tâchessimples tout en autorisant la programmation de tâches compliquées.Caractéristiques :
Langage interprété
Portabilité (sous certaines conditions)
Possibilité de Pattern Matching (expressions régulières)
Manipulation de répertoires, fichiers, processus
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 4 / 67
-
Introduction générale
Le langage Perl
Domaines d’utilisation :
Scripts divers
Administration système
Extension de ligne de commande
. . .
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 5 / 67
-
Introduction générale
Se renseigner sur Perl
Documentation complète à l’aide de “man perl”
Information sur la syntaxe d’une fonction à l’aide de “perldoc -fnom_fonction”
FAQ : http://www.perl.com/perl.faq
Modules et documentations : http://www.perl.com/perl/ ouhttp://www.perl/org
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 6 / 67
-
Introduction générale
Format d’un script Perl
Fichier avec extension pl
#!/usr/local/bin/perl -w
# Script de démonstration
$nom = "Jean Durant"; # Initialisation de la variable $nom
$age = 30; # Initialisation de $age
$age++; # Incrémentation
$aImprimer = "L’âge de $nom est $age \n"; # Concaténation
print $aImprimer; # Impression
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 7 / 67
-
Introduction générale
Format d’un script Perl
Un script Perl contient :
Une première ligne indiquant au shell l’emplacement de l’interpréteurPerl.
Des lignes de commentaires (débutant par “#”).
Des instructions.
Une instruction se termine par un “;”. Un bloc est un ensembled’instructions délimité par des accolades.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 8 / 67
-
Les variables scalaires
Les variables scalaires
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 9 / 67
-
Les variables scalaires
Types de variables
Les variables scalaires sont les briques de base du langage, elles sont dedeux types :
Type numérique
Type chaîne
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 10 / 67
-
Les variables scalaires
Opérateurs numériques
Opération Syntaxe Résultat
Egal à $a == $b Vrai/FauxDifférent de $a != $b Vrai/Faux
Inférieur (ou égal) à $a < ( (>=) $b Vrai/Faux
Comparaison $a $b 0 / 1 / -1
Plus $a + $b Somme de a et bIncrémentation $a++ (ou ++$a) Auto-incrémentationDécrémentation $a−− (ou −−$a) Auto-décrémentationMultiplication $a * $b Produit de a et b
Modulo $a % $b Reste de a divisé par bPuissance $a ** $b a puissance b
Et $a && (ou and) $b Vrai/FauxOu $a || (ou or) $b Vrai/FauxNon ! (ou not) $a Vrai/Faux
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 11 / 67
-
Les variables scalaires
Opérateurs pour chaînes
Opération Syntaxe Résultat
Egal à $a eq $b Vrai/FauxDifférent de $a ne $b Vrai/Faux
Inférieur (ou égal) à $a lt (ou le) $b Vrai/FauxSupérieur (ou égal) à $a gt (ou ge) $b Vrai/Faux
Comparaison $a cmp $b 0 / 1 / -1
Incrémentation $a++ (ou ++$a) Auto-incrémentationDécrémentation $a−− (ou −−$a) Auto-décrémentationConcaténation $a . " est un " . $b Chaîne concaténéeMultiplication $a x 6 Répétition de concaténation
Longueur length $a Longueur de $a
Et $a && (ou and) $b Vrai/FauxOu $a || (ou or) $b Vrai/FauxNon ! (ou not) $a Vrai/Faux
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 12 / 67
-
Les variables scalaires
Informations
Les opérateurs logiques sont des opérateurs court-circuits.Les affectations raccourcies sont autorisées :
$a += $b;
$a *= 3;
$c .= ";";
Une variable scalaire est fausse si :
Elle est de type chaîne et est égale soit à "", soit à "0".
Elle est de type nombre et est égale à 0.
Elle est indéfinie (a pour valeur undef ).
La fonction defined $a permet de savoir si la variable scalaire $a est définieou non.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 13 / 67
-
Les variables scalaires
Caractères spéciaux
Pour insérer des guillemets à l’intérieur d’une chaîne, deux possibilités :
"\"Arrêtez !\", dit-il."
’"Arrêtez !", dit-il.’
D’autres caractères spéciaux existent :
"\\" −→ \
"\n" −→ Saut de ligne
"\t" −→ Tabulation
. . .
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 14 / 67
-
Les variables scalaires
Exemples
$un_fruit = "une pomme";
print "Hier, j’ai mangé $un_fruit.\n";
print ’Hier, j\’ai mangé $un_fruit.\n’;
Hier, j’ai mangé une pomme.Hier, j’ai mangé $un_fruit.\n
Les variables ne sont pas remplacées par leur valeur entre ’ ’ !
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 15 / 67
-
Les variables scalaires
Exemples
$quatre = "4";
$deux = "2";
$quatre_et_deux = $quatre . $deux; # concaténation
$quatre_plus_deux = $quatre + $deux; # addition
$quatre_x_deux = $quatre x $deux; # répétition
$quatre_fois_deux = $quatre * $deux; # multiplication
print ’$quatre_et_deux = ’ . "$quatre_et_deux \n";
print ’$quatre_plus_deux = ’ . "$quatre_plus_deux \n";
print ’$quatre_x_deux = ’ . "$quatre_x_deux \n";
print ’$quatre_fois_deux = ’ . "$quatre_fois_deux \n";
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 16 / 67
-
Les variables scalaires
Nouvelles instructions
print "Comment vous appelez-vous ? ";
$nom = ; # Récupération du nom de l’utilisateur
chomp $nom; # Retrait du saut de ligne
print "Bonjour, $nom !\n";
Comment vous appelez-vous ? Obi-Wan KenobiBonjour, Obi-Wan Kenobi !
sert à lire une ligne dans un flux de données. Ici, il est équivalent à. chomp sert à retirer les sauts de ligne à la fin d’unechaîne (chop supprime le dernier caractère, quel qu’il soit). chop et chomppeuvent être appliquées sur des listes.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 17 / 67
-
Les variables scalaires
Exercices
Ecrivez une fonction qui demande d’entrer une phrase, puis un nombre etqui recopie la phrase donnée le nombre de fois indiqué.
Ecrivez une fonction qui demande d’entrer un nombre et donne la table demultiplication de 1 à 10 correspondante.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 18 / 67
-
Autres types de variables
Autres types de variables
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 19 / 67
-
Autres types de variables
Les tableaux (généralités)
Un tableau est une liste ordonnée de scalaires indicée par la position duscalaire dans la liste. Les variables de type tableaux (ou liste) se présententsous la forme :
@utilisateur = ("roger","/home/roger/",1000,"/bin/tcsh")
On accède aux éléments du tableau par des nombres ou par bloc :
$nomUtilisateur = $utilisateur[0];
($login,$home,$uid,$shell) = @utilisateur;
L’indexation commence à 0. On utilise $ pour référencer un élément dutableau.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 20 / 67
-
Autres types de variables
Les tableaux (initialisation)
Plusieurs méthodes :
$utilisateur[0] = "roger";
$utilisateur[1] = "/home/roger";
$utilisateur[2] = 1000;
$utilisateur[3] = "/bin/tcsh";
@utilisateur = ("roger","/home/roger/",1000,"/bin/tcsh");
@utilisateur1 = @utilisateur2;
@utilisateur = f();
où f() retourne un ensemble de scalaires.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 21 / 67
-
Autres types de variables
Opérations de base sur les tableaux
pop Tab : traite un tableau comme une pile. Elle dépile le dernierélément du tableau en diminuant sa taille de 1.
push Tab Liste : traite Tab comme une pile et empile les valeurs deListe à la fin du tableau (dont la longueur augmente de celle de Liste).
shift Tab : décale la première valeur du tableau et la renvoie, réduisantainsi la taille du tableau. Si le tableau est vide, renvoie undef.
unshift Tab Liste : fait l’inverse de shift, en ajoutant au début dutableau les éléments de Liste et renvoie le nombre d’éléments dans lenouveau tableau.
map expr,Liste : applique à chaque élément de Liste l’expression expr.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 22 / 67
-
Autres types de variables
Les tableaux (divers)
sort LIST permet de trier un tableau ou une liste selon plusieurs critères.On peut définir lors de l’appel la fonction de comparaison à utiliser entreles variables $a et $b.
# Tri dans l’ordre alphabétique
@UtilisateursTries = sort {$b cmp $a} @utilisateurs;
# Tri par ordre numérique
@NumDeTel = sort {$a $b} @tel;
On peut récupérer la taille d’un tableau @t de deux manières différentes :
$nbElems = scalar @t;
$DerIndice = $#t;
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 23 / 67
-
Autres types de variables
Les tables de hachage (initialisation)
Un hachage hash est une liste d’éléments indexés par des chaînes. Unevariable de type hachage a la forme %nomDuHachage.Il y a plusieurs méthodes d’initialisation :
%exam = (); # Initialisation à vide
$exam{Durant} = 19;
$exam{Brown} = 13;
$exam{Schmit} = 18;
%exam = (
Durant => 19,
Brown => 13,
Schmit => 18,
);
%exam = ("Durant",19,"Brown",13,"Schmit",18);
L’accès à un élément se fait par : $nomDuHachage{$nomDeLaClé}.J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 24 / 67
-
Autres types de variables
Opérations de base sur les hachages
keys Hash : retourne les clés du hachage. @nom = keys %exam;
values Hash : duale de la fonction keys. Elle renvoie les différentesvaleurs du hachage dans un ordre aléatoire (dû au codage interne deshachages).
each Hash : retourne chaque paire (clé,valeur) du hachage.
exists expr : renvoie vrai si la clé spécifiée existe dans le hachage.Attention, une clé peut être définie sans que la valeur correspondantene le soit !
delete expr : détruit la clé et sa valeur correspondante. delete$MonHash{$MaCle}. On peut détruire tout un hachage de la façonsuivante : undef %MonHash;
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 25 / 67
-
Conditionnelles et boucles
Conditionnelles et boucles
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 26 / 67
-
Conditionnelles et boucles
Les conditionnelles
if (condition 1){
instruction 1;
}else{
instruction 2;
}
où les conditions sont n’importe quelle expression susceptible d’êtreinterprétée comme une variable booléenne.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 27 / 67
-
Conditionnelles et boucles
Les conditionnelles
if (condition 1){
instruction 1;
}elsif(condition 2){
instruction 2;
}elsif(condition 3){
instruction 3;
}else{
instruction 4;
}
Le switch n’existe pas et est remplacé par des elsif imbriqués.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 28 / 67
-
Conditionnelles et boucles
Les conditionnelles
unless($user eq "root"){
print $user;
}
unless est la duale de if.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 29 / 67
-
Conditionnelles et boucles
Les structures de boucle
while($user ne "root"){
print $user;
}
until($user eq "root"){
print $user;
}
until est la duale de while. La syntaxe de for est la même qu’en C.
for($i=0;$i
-
Conditionnelles et boucles
Les structures de boucle
La boucle foreach parcourt une liste de valeurs et applique à chaquevariable l’instruction indiquée.
foreach $elem (@MonTab){
$elem *= 2;
}
foreach $nom (keys %exam){
if ($exam{$nom} >= 10){
print $nom;
}
}
Si aucun nom de variable n’est spécifié (i.e. foreach (LISTE), les élémentsseront contenus dans la variable par défaut $_.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 31 / 67
-
Conditionnelles et boucles
Exercices
Ecrivez une fonction qui tire un nombre entier aléatoire entre 0 et 100 (int(rand 101);) et qui vous répond si c’est plus ou moins à chacune de vostentatives, jusqu’à ce que vous ayez trouvé.
Ecrivez une fonction qui entre dans un tableau les 100 premiers nombrespremiers, puis affiche tous les éléments du tableau.
Créez une table de hachage pour gérer votre stock de vin, dans laquelle lenom du vin est utilisé comme clé, tandis que la quantité correspond à lavaleur. Vous demanderez au début de la fonction combien de vinsdifférents doivent être entrés dans le stock.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 32 / 67
-
Les expressions régulières
Les expressions régulières
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 33 / 67
-
Les expressions régulières
Quel intérêt ?
Les expressions régulières permettent d’écrire une expression qui représenteplusieurs chaînes à la fois. On peut faire :
Du pattern matching, avec l’opérateur m//
De la substitution, avec l’opérateur s//
L’opérateur de recherche m prend une chaîne et un motif en entrée etretourne VRAI si le motif appartient à la chaîne, FAUX sinon.
L’opérateur de substitution prend une chaîne et deux motifs. Il substitue ledeuxième motif au premier et retourne le nombre de changements réalisés.
On utilise toujours, pour récupérer le résultat de la fonction, l’opérateur=∼.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 34 / 67
-
Les expressions régulières
Exemples
while($ligne = ){
if($ligne =~ m/http:/){
print $ligne;
}
}
while($ligne = ){
$ligne =~ s/http:/ftp:/;
print $ligne;
}
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 35 / 67
-
Les expressions régulières
Décrire un motif
Les opérateurs regardent si la chaîne présentée peut être parsée par lemotif. Ils renvoient toujours le motif le plus grand et le plus à gauche.
Les motifs fonctionnent comme des chaînes entre doubles apostrophes. Lesvariables y sont interpolées.
Si une recherche de motif intervient dans une boucle, le motif est recalculéà chaque tour de boucle.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 36 / 67
-
Les expressions régulières
Outils de description
Les répétitions :
∗ −→ un nombre quelconque de fois, éventuellement nul, derépétitions du caractère qui le précède.
+ −→ un nombre quelconque, non nul, de répétitions du caractère quile précède.
? −→ présence éventuelle du caractère qui le précède.
/clef?/
/t?riche/
/Ahh*/
/Ah+/
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 37 / 67
-
Les expressions régulières
Outils de description
Autres outils :
{ } −→ permettent de quantifier un nombre d’occurrences. Elless’utilisent sous la forme {x,y}, avec x ≤ y et x , y ∈ N.
. −→ correspond à n’importe quel caractère.
[ ] −→ permettent de donner des classes d’équivalences de motifs. Lecaractère ^permet de faire la négation d’une classe.
() −→ permettent de grouper des lettres ou des motifs. Après avoirmatché la chaîne, les expressions correspondant aux motifs entreparenthèses sont stockées dans les variables $1,$2,. . .
| −→ définit une conditonnelle.
^−→ permet d’imposer la position du motif en début de chaîne.
\ −→ permet de définir des caractères spéciaux et de quoter les métacaractères.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 38 / 67
-
Les expressions régulières
Outils de description
/meuh{3}/
/meuh{3,5}/
/.*e/
/[pcfg]endre/
/toto.[^ch]/
/(meuh){3}/
if (m/Time:(..):(..):(..)/){
$heure = $1;
$minute = $2;
$seconde = $3;
}
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 39 / 67
-
Les expressions régulières
Outils de description
/(Pierre|Marie) Currie/
/^chatie/
$programme =~ m/(\/\*.*\*\/)/;
print $1;
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 40 / 67
-
Les expressions régulières
Caractères spéciaux
Caractère Equivalent Signification
\n Saut de ligne\r Retour chariot\t Tabulation\f Saut de page\e Echappement\d [0-9] Un chiffre\D [^0-9] Un caractère non-numérique\w [0-9a-z] Un caractère alphanumérique dans un mot\s [ \t\n\r\f] Un espace quelconque\S Autre chose qu’un espace
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 41 / 67
-
Les expressions régulières
Spécifier le lieu
Des caractères spéciaux permettent de spécifier au moteur des lieux précispour la correspondance de caractères.
Caractère Signification
\b Délimiteur de mot\B Non délimiteur de mot
\A ou ^ Recherche en début de chaîne\Z ou $ Recherche en fin de chaîne
/\bFred\b/
/Fred$/
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 42 / 67
-
Les expressions régulières
Options de recherche
Option Comportement
? après un quantifieur Cherche le plus petit motifg Recherche globale, toutes les occurrencesi Ne tient pas compte de la casseo Compile le motif une seule foism Traite la chaîne comme des lignes multipless Traite la chaîne comme une seule ligne
On peut également spécifier un symbole de remplacement du "/"
$a = "/usr/local/share/emacs/site-lisp/";
$partition =~ m#/.*?/([^/]+)/.*/$#;
print $1;
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 43 / 67
-
Les expressions régulières
La fonction grep
grep expr,liste
La fonction grep évalue, pour chaque élément de la liste, l’expression expr.
Dans un contexte liste, elle retourne la liste des éléments pour lesquelsl’expression a retourné VRAI.
Dans un contexte scalaire, elle retourne le nombre d’éléments pourlesquels l’expression a retrouné VRAI.
@users = grep /tcsh,@passwd;
foreach (@users){
print $_."\n" if /home/;
}
foreach (grep /home, grep /tcsh,@passwd){
print $_."\n";
}
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 44 / 67
-
Les expressions régulières
La fonction split
split /motif/,expr,lim
La fonction split effectue une recherche de motif dans expr et éclate exprdans un tableau qu’elle retourne. Par exemple :
@champs = split /:/,$ligne;
print "$login = $champs[0]\n";
Si lim est spécifié, l’éclatement produira un tableau avec au plus liméléments.
($login,$passwd,$reste) = split /:/,$ligne,3;
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 45 / 67
-
Les expressions régulières
Exercices
Ecrivez une fonction vérifiant qu’une chaîne saisie correspond bien à uneimmatriculation de véhicule en France. Il s’agit donc d’une immatriculationde la forme suivante : 2 lettres majuscules, 1 tiret, 3 chiffres, 1 tiret, 2lettres majuscules (exemple : AA-000-AA).
Ecrivez une fonction vérifiant qu’une chaîne saisie correspond bien à uneopération arithmétique entre entiers correcte non parenthésée, à savoir unnombre entier suivi d’un opérateur (+,-,*,/), suivi d’un autre nombre entier(n fois).
Ecrivez une fonction qui récupère une chaîne saisie par l’utilisateur etcalcule le nombre de mots ainsi que le nombre de caractères contenus danscelle-ci.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 46 / 67
-
Travailler avec des entrées/sorties
Travailler avec des entrées/sorties
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 47 / 67
-
Travailler avec des entrées/sorties
Entrée/Sortie standard
Les entrées sorties standard sont, classiquement, le clavier et l’écran :
clavier : STDIN
écran : STDOUT
Pour lire dans un flux de données, on utilise l’opérateur angle :.
$name = ;
@notes = ;
while ($a = ) {print $a;}
L’opérateur est associé par défaut à STDIN et il met par défaut le résultatde sa lecture dans la variable $_.
while(){print $_}
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 48 / 67
-
Travailler avec des entrées/sorties
L’écriture
Standard
L’écriture sur les sorties (standard et erreur) se fait via la fonction print.Par défaut, elle écrit sur la sortie standard le contenu de la variablecourante $_.
print STDOUT $_; = print $_; = print;
Elle écrit le second paramètre (chaîne) sur le premier (handle).
Erreur
Pour envoyer un message d’erreur, on utilise généralement STDERR. Lafonction warn affiche directement sur l’erreur standard.
if(err){ print STDERR "Il y a eu un problème\n"; }
if(err){ warn "Il y a eu un problème\n"; }
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 49 / 67
-
Travailler avec des entrées/sorties
Les fichiers
Même procédure qu’en C :
1 Ouvrir le fichier et récupérer le Handle du fichier.2 Manipuler le Handle.3 Fermer le Handle.
open(hand,N); close(hand);
où hand est le nom du Handle et N un paramètre qui permet de décrire lenom du fichier et le mode d’ouverture.
Symbole Mode d’ouverture
> Ecriture< Lecture>> Ajout+ > Lecture et écriture| Pipe
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 50 / 67
-
Travailler avec des entrées/sorties
Les fichiers
open(LOG, ">>log") or die "Erreur",$! ;
open(DATAS, "
-
Travailler avec des entrées/sorties
Exemple
$fileIn = shift;
$fileOut = shift;
$motif = shift;
## ouverture du fichier entree
open(INFILE, "$fileOut") or die "Problème \"$fileIn\"", $!;
while (){
## option o pour ne pas recompiler le motif
print OUTFILE $_ if (/$motif/o);
}
close INFILE;
close OUTFILE;
Ce script réalise un grep.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 52 / 67
-
Travailler avec des entrées/sorties
Tests sur les fichiers
Syntaxe Test réalisé
-r/-w/-x Accessibilité en lecture/écriture/exécution-o Propriété-e Existence-z Taille 0-s Retourne la taille-f Fichier simple-d Répertoire-l Lien symbolique-p Pipe-S Socket-B Fichier binaire-T Fichier texte
-M/-A/-C Age en jours depuis modification/accès/changement d’inode
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 53 / 67
-
Travailler avec des entrées/sorties
Les répertoires
Changer de répertoire
Avec chdir : renvoie VRAI (1) ou FAUX ("").
chdir("/etc") or die "Impossible d’aller dans /etc ($!)";
Récupérer plusieurs noms de fichiers
Dans le répertoire courant, avec l’opérateur de globalisation glob expr (ou).
$where = "/etc/";
chdir($where) or die "impossible d’aller dans $where ($!)";
@lesfic = ;
foreach $fic (@lesfic){
print $fic, "\n";
}
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 54 / 67
-
Travailler avec des entrées/sorties
Les répertoires
On peut ouvrir un répertoire (en lecture uniquement) avec opendir. On leferme avec closedir.
opendir handle,expr;
Plusieurs fonctions :
readdir HANDLEREP lit un nom de fichier.
rewindidr HANDLEREP repositionne au début du répertoire (pourreprendre l’énumération du début).
telldir HANDLEREP retourne la position courante.
seekdir HANDLEREP,pos positionne le Handle à la position pos.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 55 / 67
-
Travailler avec des entrées/sorties
Opérations sur les fichiers
chmod LISTE change les permissions des fichiers contenus dansLISTE.
chown LISTE change propriétaire et groupe de chaque fichier deLISTE.
rename ANCIENNOM,NOUVEAUNOM change le nom d’un fichier.Renvoie 1 ou 0. Si NOUVEAUNOM existe déjà, il est détruit.
symlink FEXIST,LIEN crée un lien symbolique de LIEN à FEXIST.
rmdir HANDLEFIC détruit le fichier dont le Handle est HANDLEFIC.Retourne 1 ou 0 et s’applique par défaut à $_.
unlink LISTE détruit les fichiers spécifiés dans LISTE (ou le fichier$_) si pas d’argument liste. Renvoie le nombre de fichiers détruits.
seek HANDLE,POS : même principe que seekdir sur les dossiers. tellexiste aussi (sur le modèle de telldir).
. . .
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 56 / 67
-
Travailler avec des entrées/sorties
Exercices
Ecrivez une fonction qui prend un nom de fichier en paramètre. Ce fichiercontient des entiers (un par ligne). Votre fonction doit renvoyer le plusgrand de ces nombres.
Un fichier contient une liste d’étudiants avec leurs notes respectives à unexamen. Chaque ligne est de la forme nom de l’étudiant,note. Créez unefonction prenant le nom du fichier en paramètre et remplissant une table dehachage où le nom de l’étudiant correspond à la clé, tandis que la notecorrespond à la valeur. Vous afficherez ensuite la meilleure note, la moinsbonne et la moyenne de classe.
Créez une fonction prenant en paramètre un nom de dossier et une date(sous la forme jj/mm/aaaa). Vous vérifierez que la date est au bonformat). Cette fonction doit afficher la liste des fichiers ayant été modifiésaprès la date indiquée.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 57 / 67
-
Divers
Divers
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 58 / 67
-
Divers
Les processus
Lancer des processus depuis un script Perl :
system LISTE exécute un programme existant sur le système enparallèle et attend qu’il se termine. Retourne 0 si l’exécution s’est bienpassée.exec LISTE exécute le programme contenu dans LISTE en le lançantà sa place. Ne rend la main qu’en cas de problème.‘ ‘ fait la même chose que system, à la différence que la sortiestandard de la commande est retourné sous forme de liste.
exec ’/bin/echo’,@ARGV;
die "Impossible d’exécuter csh : $!\n";
$motif = shift;
@reps = ‘find . -type d -print‘;
foreach(@reps){
print;
}J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 59 / 67
-
Divers
Les fonctions
Les fonctions (ou sous-programmes) disposent de leur espace de nompropre. Elles se déclarent ainsi :
sub NOM;
Elles se définissent ainsi :
sub NOM BLOC
Pour appeler une fonction :
Nom (LISTE);
&Nom LISTE;
Le sous-programme récupère ses paramètres dans le tableau @_. Ilretourne l’évaluation à l’aide de return. S’il n’y a pas de return, il renvoie lavaleur de la dernière expression évaluée.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 60 / 67
-
Divers
Les fonctions
#!/usr/local/bin/perl -w
## -*- Perl -*-
sub minmax{
## récupère la premiere valeur de @_
$min =$max = shift;
## pour chaque valeur dans @_
## on met a jour le min et le max si nécessaire
while ($courant = shift){
$max = $courant if ($courant > $max) ;
$min = $courant if ($courant < $min);
}
($min, $max);
}
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 61 / 67
-
Divers
Les fonctions
## on met dans @_ le contenu de STDIN
## a raison d’une ligne par case du tableau
@_ = ;
## appel a minmax -> on recupere dans $t le min et $a le max
($t, $a) = &minmax;
chomp ($t, $a);
print "min : $t, max : $a\n";
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 62 / 67
-
Divers
Les variables locales
Deux méthodes pour créer des variables locales :
my expr permet de déclarer une variable privée dans lebloc/sous-programme/fichier qui l’encadre. my($v1,$v2,$v3) = @_est possible.
local expr utilise la même syntaxe que my. La différence est que localfait une sauvegarde de la valeur de la variable pour la restituer à la finde la portée
La différence entre les deux est don essetniellement une différence deportée. L’intérêt de local est donc principalement dans les fonctionsrécursives et celles qui ont des effets de bord sur les variables globales.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 63 / 67
-
Divers
Les variables locales
if(scalar @ARGV){
local @ARGV = @ARGV;
print "parametre ";
while($_ = shift){
print " $_";
}
print "\n";
}
print "\n", ’affichage de @ARGV:’, "@ARGV\n";
###Exécution###
script a b c d e
----->
parametre a b c d e
affichage de @ARGV :a b c d eJ.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 64 / 67
-
Divers
Les variables locales
if(scalar @ARGV){
my @ARGV = @ARGV;
print "parametre ";
while($_ = shift){
print " $_";
}
print "\n";
}
print "\n", ’affichage de @ARGV 2 :’, "@ARGV\n";
###Exécution###
script a b c d e
----->
parametre a b c d e
affichage de @ARGV 2 :J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 65 / 67
-
Divers
Exercices
Créez une fonction qui calcule la factorielle d’un nombre passé enparamètre, de façon récursive.
Ecrivez un programme qui parcourt l’aborescence depuis le répertoirecourant et qui supprime les fichiers dont l’extension est entrée enparamètre.
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 66 / 67
-
Divers
C’est fini !Cours inspiré du site du zéro et du cours de Franck Thollard
J.P. Peyrache (UJM - FST) La programmation en Perl Licence Info - S5 67 / 67
Introduction généraleLes variables scalairesAutres types de variablesConditionnelles et bouclesLes expressions régulièresTravailler avec des entrées/sortiesDivers