Partie 2

Sommaire :

Quelques exercices pour débuter
Epressions régulières

Quelques exercices pour débuter

exercice 0 : Script direct en ligne de commande

Consigne :
Appel direct à Perl en ligne de commande
Syntaxe : perl -e ' < bloc d'instructions PERL >'
Exemples à tester et à comprendre :
perl -v
man perl
man perlfunc
perl -e '$prenom ="Jean"; print "Bonjour $prenom\n"'
perl -e 'foreach $i (0..10) { print "7x$i = ",7*$i,"\n" ;}'
perl -e '$n=7; foreach $i (0..100) {printf "%3d x %3d = %5d\n" , $n, $i, $n*$i;}'

La ligne : perl -v donne le résultat suivant :
Voir le résultat

La ligne : man perl donne le résultat suivant :
Voir le résultat

La ligne : man perlfunc donne le résultat suivant :
Voir le résultat

La ligne : perl -e '$prenom ="Jean"; print "Bonjour $prenom\n"' donne le résultat suivant :
Voir le résultat

La ligne : perl -e 'foreach $i (0..10) { print "7x$i = ",7*$i,"\n" ;}' donne le résultat suivant :
Voir le résultat

La ligne : perl -e '$n=7; foreach $i (0..100) {printf "%3d x %3d = %5d\n" , $n, $i, $n*$i;}' donne le résultat suivant :
Voir le résultat
Retourner en haut de la page

exercice 1 : Interpolation et concaténation des variables

Consigne :
Une variable simple (dite "scalaire") est un identificateur toujours précédé du symbole $
print, l'instruction d'affichage, ne fait pas passer à la ligne automatiquement, c'est le rôle du caractère \n, qu'il faudra donc utiliser systématiquement.
Exécuter le petit script ci-dessous :
Comparez $s1 et $s2. Observer la différence entre l'usage des quotes ' et des guillemets ". Conclure.
Comparez $s3 et $s4. En déduire 2 façons de concaténer du texte avec des variables.
Modifier pour faire afficher :
Bonjour Jean
As-tu vraiment 25 ans ?
--------------------------------------------- #!/usr/bin/perl -w
$age = 25;
$prenom ="Jean";
$salut = "Bonjour";
$s1 = "Bonjour $prenom\n";
print $s1;
$s2 = 'Bonjour $prenom\n';
print $s2;
$s3 = $salut." ".$prenom."\n";
print $s3;
$s4 = "$salut $prenom\n";
print $s4;

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

exercice 2 : Entrées-sorties console

Consigne :
Les accès aux fichiers s'effectuent habituellement par l'intermédiaire de variables particulières appelées filehandles, en français descripteurs de fichiers.
Perl dote chaque programme exécuté de 3 descripteurs prédéfinis, STDIN, STDOUT et STDERR (reprise des canaux standard d'Unix : entrée clavier, sortie écran, sortie en erreur) qui sont immédiatement utilisables sans déclaration, contrairement aux accès à des fichiers réels.
- L'opérateur de lecture sur l'entrée standard (le clavier) est noté <STDIN>, souvent abrégé en <>
Un appel à cet opérateur lit la ligne saisie jusqu'au prochain caractère "nouvelle ligne" (y compris)
- L'instruction chomp $var permet de retirer ce caractère \n de la chaine et renvoie 1 s'il réussit
Ne pas la confondre avec chop $var qui retire le dernier caractère quel qu'il soit et le renvoie.
- La sortie standard sur l'écran, est noté <STDOUT>. L'écriture, ici l'affichage écran, s'effectue avec print, sous la syntaxe générale : print STDOUT $texte; qu'il est agréable d'abréger en : print $texte
Le code est-il correct ? Commenter l'exécution ensuite
Corriger si nécessaire
Compléter le dialogue en demandant l'age
---------------------------------------------
#!/usr/bin/perl -w
# erreur de syntaxe classique : ne pas mettre de virgule après le filehandle
print STDOUT "Quel est ton prénom ? ";
$prenom = <STDIN>;
print "Bonjour
$prenom, comment vas-tu ? \n";

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

exercice 3 : opérateurs numériques

Consigne :
1. Dans le code qui suit, quel est le role du caractère \ devant $a ?
2. Faire lire 2 variables numériques $a et $b, à l'aide de l'opérateur <>
3. Faire afficher le résultat de l'addition sous la forme (par exemple)
$a + $b = 200 + 350 = 550
4. Prolongement : à l'aide d'une itération while, dont le syntaxe est esquissée ci-dessous, afficher la table de multiplication par N (N saisi)
---------------------------------------------
#!/usr/bin/perl -w
print "\$a = ";
$a = <>;

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

exercice 4 : boucle de lecture while

Consigne :
Saisir des lignes au clavier dans une boucle while (tant que) avec l'opérateur <>
La fin de la saisie est provoquée par l'envoi du caractère Ctrl-d (eof) sur une ligne vide
1. Expliquer et tester le script initial
2. Expliquer ICI pourquoi l'affichage est identique à la saisie
3. Réécrire en n'utilisant que la variable spéciale $_ (voir ci-dessous, variables scalaires 5et 6)
---------------------------------------------
#!/usr/bin/perl -w
print "Saisir une nouvelle ligne : ";
while ($ligne = <>) {
$texte .= $ligne;
}
print "Vous avez saisi le texte \n $texte \n";

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat

Autre Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

exercice 5 : accès au fichier

Consigne :
La fonction open associe au fichier spécifié un filehandle (descripteur de fichier)
Syntaxe :
$fichier= "/chemin/vers/fichier";
open F, $fichier;# ouverture en lecture seule du fichier en lui attribuant le descripteur F
open F, ">$fichier"; # ouverture en écriture
open F, ">>$fichier";# ouverture en ajout dans un fichier existant
print F $chaine;# écriture de $chaine dans le fichier
Chaque appel à l'opérateur "chevron" appliqué au descripteur F, provoque la lecture de la ligne suivante dans le fichier.
l'instruction print F $chaine (attention, pas de virgule !) écrit la chaine comme un enregistrement dans le fichier
Rappel : en l'absence de descripteur, print envoie ses arguments sur la sortie standard, c'est-à-dire l'écran
1. Expérimenter le script suivant.
2. Expliquer le fonctionnement de la boucle de lecture : quel résultat renvoie l'affectation $ligne=<F>
---------------------------------------------
#!/usr/bin/perl -w
# ouverture en lecture du fichier des comptes utilisateurs
open F, "/etc/passwd";
# on aurait pu utiliser des variables :# $fichier="/etc/passwd";
open F, $fichier;
while ($ligne = <F>) {
print "ligne $. : $ligne";
}
close F;

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Retourner en haut de la page

exercice 6 : écrire dans un fichier

Consigne :
Ecrire ajouter.pl
1. Lire le nom du fichier (s'il n'existe pas, le nom sera "ajout.txt")
2. Ouvrir ce fichier en ajout
3. Ecrire une boucle (cf exo4.pl), dans laquelle chaque ligne saisie au clavier est immédiatement écrite dans le fichier
4. Après sortie de boucle, pour contrôler afficher le contenu du fichier créé.

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir un résultat possible
(nous avons ajouté les lignes : --------------------- xxxxxxxxxxxxxxxxxxxxxxx)
Retourner en haut de la page

exercice 7 : copier un fichier

Consigne :
Ecrire copier.pl
1. Lire le nom du fichier à copier (s'il n'existe pas, le nom sera "essai.txt")
2. Lire le nom du fichier qui doit contenir la copie (par défaut "copie.txt")
3. Ouvrir ces 2 fichiers en lecture ou en écriture
4. Tant qu'il y a une ligne à lire dans le fichier source, la copier dans le fichier cible
5. Pour contrôler, afficher le contenu du fichier copié

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

Expressions régulières

Localisation des motifs

Consigne :
Voici un petit texte débile, qu'on pourra améliorer à son gout
On demande d'écrire les motifs, puis de tester, pour chercher :
1. l'un des mots "moi", "toi", partout dans le texte
2. les sous-chaines "moi" ou "toi".
3. le mot "moi" seulement en début de phrase
tester la différence entre recherche de mots et de sous-chaines
#!/usr/bin/perl -w
$texte="Il y a 2 mois, ce n'est pas toi qui a découvert cette vieille armoire, cachée sous la toiture\n.Moi, je te dis que c'est bien moi, il y a 2 ou 3 mois ";
$motif=<>;
chomp($motif);
print "Recherche de $motif\n";

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

Cherche des mots dans un texte

Consigne :
- version 1 Soit un texte stocké dans le fichier texte (on pourra utiliser par défaut gpl.txt en anglais, et aussi tester regex.txt). On demande à l'utilisateur de saisir le mot recherché.
Le script doit parcourir chaque ligne du fichier et afficher chaque ligne où le mot est présent en le mettant en valeur (si on générait du code HTML on pourrait mettre en gras ou en couleur) en l'entourant par exemple de << >>.
Conclure l'étude par une phrase du genre :
"le mot .... est présent ... fois dans .. lignes du fichier ..."
"le mot .... n'a pas été trouvé dans le fichier ..."
Essai avec les mots "fois", "du", "mes" (problème ! que pourrait-on faire ?)
- version 2 Modifier le script précédent pour compter les occurences des mots au cas où il n'y a pas de saisie. On améliorera en convertissant en interne les lignes en minuscules et en "oubliant" les accents ...

Réponse 1ère version :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat

Réponse 2ème version :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

Cherche tous les mots contenant une lettre redoublée

Consigne :
Soit un texte stocké dans un fichier texte nommé essai.txt, qu'on pourra modifier
L'utilisateur saisit une chaine au clavier. Le script doit afficher : "Dans la ligne numéro .. , la lettre .. est redoublée dans le mot ..."
Conseil : pensez à utiliser le métacaractère d'ancrage \b, les variables de capture ainsi que $&

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

Exercice de conjugaison

Consigne :
Reconnaitre qu'un verbe est écrit à l'infinitif, et dans ce cas donner sa conjugaison au présent de l'indicatif
Au choix, les verbes sont entrés interactivement (par défaut "chanter") ou à partir d'un fichier
Conseil : construire un tableau associatif admettant les pronoms (je, tu, il ...) comme clés et les terminaisons (e, es, e, ons, ez, ent) correspondantes
Construire une expression régulière pour reconnaitre une terminaison en "er" et capturer le radical
Si le verbe est reconnu (par ex. "chanter", afficher la conjugaison sous la forme :
je chante
tu chantes....

Réponse :
Nous n'avons pas réussi à conjuguer en tenant compte de l'ordre canonique des pronoms personnels.
Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page

Conversion francs-euros

Consigne :
Etant donnée une phrase qui contient une somme exprimée en francs, la convertir en euros
On supposera que la somme, d'abord nombre entier puis décimal, est suivi du symbole F ou f
La phrase sera saisie. En son absence, une phrase par défaut est prévue

Réponse :

Télécharger le script (clic droit + enregistrer la cible sous)
Voir le résultat
Retourner en haut de la page