Problème sur l'entame de ce code

Problème sur l'entame de ce code - Perl - Programmation

Marsh Posté le 07-01-2015 à 20:46:25    


 
 
On teste les réponses de l'exercice 1 en scannant un fichier d'entrée et en produisant un fichier de sortie.
Fichier d'entrée : RegExpTP4_Ex2.txt.
Fichier de sortie : SortieRegExpTP4_Ex2.txt. Ce fichier de sortie est à votre disposition.
Lorsque vous rendrez le script, nous le lancerons et devrons trouver exactement le même fichier de sortie.
 
Vous rendrez un dossier compressé contenant votre script nommé TP4_Exo2.pl et le fichier d'entrée. Nous lancerons le script qui produira le fichier de sortie dans le même dossier, il portera le nom indiqué plus haut. Il ne nous restera plus qu'à vérifier que votre fichier de sortie coïncide rigoureusement avec celui fourni.
 
Factorisation du code.
On attend deux fonctions afficheTitre et afficheLignes
 
afficheTitre attend le titre à afficher pour chaque item :
 
afficheTitre("1.g : lignes contenant des crochets ( ] ou [ )" );
 
et produit l'affichage correspondant :
 
**********************************************
1.g : lignes contenant des crochets ( ] ou [ )
**********************************************
 
(Lignes 145 à 147 du fichier de sortie).
Il y a autant d'étoiles que de caractères au-dessus et en-dessous de la ligne à afficher. Copiez les 3 lignes dans un éditeur de textes basique et vous verrez que c'est vrai ;-).
 
afficheLignes attend l'expression régulière et la liste des lignes à tester :
 
afficheLignes('[\[]|[\]]',@lignes);
# RegExp entre quottes, c'est plus lisible qu'avec guillemets
 
et produit l'affichage correspondant :
 
cette ligne contient des [
] cette ligne aussi
capitaine [] est tres mechant
***** 3 lignes trouvees *****
 
(lignes 148 à 151 du fichier de sortie).
 
cette ligne ne contient ni chiffre ni majuscule
Cette ligne contient 1 chiffre et une majuscule
Celle ci ne contient qu'une majuscule
celle ci ne contient que le chiffre 9 et pas de majuscule
4444
MMMM
Aaa4
zz lm :
Cette ligne termine par un point.
C'est dur...
. premiere partie
on fait le . ?
..
cette ligne contient 3 points ......
cette ligne . ne contient pas . la ponctuation 3 points.
Un nombre hexadecimal : AE456
FFF est un hexadecimal
cette ligne contient 124EF il est hexadecimal
voila un mot qui contient au moins 12 caracteres alphanumeriques 1a2bc3d4e5f6
1a2bc3d4e5f6g7 est un mot qui contient 14 caracteres alphanumeriques
Voila un mot 1a2bc3d4e5f6g7 il contient 14 caracteres alphanumeriques
1a2bc3d4e5 a 10 caracteres
cette ligne a contient a 5 fois a la lettre a
aaaaaaaaaaaaaaa
cette ligne contient des [
] cette ligne aussi
capitaine [] est tres mechant  
la ligne suivante ne contient que des espaces
                 
la ligne suivante ne contient que des a et des espaces
a a a a              aaaa    aa  
Ceci ressemble a une adresse IP : 123.456.789.145
Ceci aussi : 12.456.7.14
1.45.9.14 est une IP
totoAUneIPfixeQuiEst1.369.258.14IlEnEstContent
2369.235.26.158963 ressemble malheureusement a une IP
01 24 58 96 52
41 52 69 78 56
12 36 98 74 56 12
12.13.14.58.96
78 96 32 85 41fgtr
01-23-45-67-89
Tel : 41 52 69 78 56
(0)1-23-45-67-89
Tel : (0)1 52 69 78 56
(1)2 36 98 74 56 12
(0)2.13.14.58.96
(0)1 24 58 96 52
(1)2.13.14.58.96
(0)123456
toto (0) 123 456 789
toto (0) 123 456 789 titi
bisous
toto (0) 123.456-789
toto (1) 123-456-789
toto (0) 123.456.789
toto 0 123.456-789
toto 1 123-456-789
toto 0 123.456.789
 
***********************************************
PERL : Fichier de sortie de l'exercice 2 du TP4
***********************************************
 
*****************************************************
1.a : lignes contenant des chiffres ou des majuscules
*****************************************************
LP ASR
PERL
Fichier test pour les expressions regulieres
Auteur : GB
Revision : 11/11/2010
Cette ligne contient 1 chiffre et une majuscule
Celle ci ne contient qu'une majuscule
celle ci ne contient que le chiffre 9 et pas de majuscule
4444
MMMM
Aaa4
Cette ligne termine par un point.
C'est dur...
cette ligne contient 3 points ......
cette ligne . ne contient pas . la ponctuation 3 points.
Un nombre hexadecimal : AE456
FFF est un hexadecimal
cette ligne contient 124EF il est hexadecimal
voila un mot qui contient au moins 12 caracteres alphanumeriques 1a2bc3d4e5f6
1a2bc3d4e5f6g7 est un mot qui contient 14 caracteres alphanumeriques
Voila un mot 1a2bc3d4e5f6g7 il contient 14 caracteres alphanumeriques
1a2bc3d4e5 a 10 caracteres
cette ligne a contient a 5 fois a la lettre a
Ceci ressemble a une adresse IP : 123.456.789.145
Ceci aussi : 12.456.7.14
1.45.9.14 est une IP
totoAUneIPfixeQuiEst1.369.258.14IlEnEstContent
2369.235.26.158963 ressemble malheureusement a une IP
01 24 58 96 52
41 52 69 78 56
12 36 98 74 56 12
12.13.14.58.96
78 96 32 85 41fgtr
01-23-45-67-89
Tel : 41 52 69 78 56
(0)1-23-45-67-89
Tel : (0)1 52 69 78 56
(1)2 36 98 74 56 12
(0)2.13.14.58.96
(0)1 24 58 96 52
(1)2.13.14.58.96
(0)123456
toto (0) 123 456 789
toto (0) 123 456 789 titi
toto (0) 123.456-789
toto (1) 123-456-789
toto (0) 123.456.789
toto 0 123.456-789
toto 1 123-456-789
toto 0 123.456.789
***** 50 lignes trouvees *****
 
*********************************
1.b : lignes contenant des points
*********************************
Cette ligne termine par un point.
C'est dur...
. premiere partie
on fait le . ?
..
cette ligne contient 3 points ......
cette ligne . ne contient pas . la ponctuation 3 points.
Ceci ressemble a une adresse IP : 123.456.789.145
Ceci aussi : 12.456.7.14
1.45.9.14 est une IP
totoAUneIPfixeQuiEst1.369.258.14IlEnEstContent
2369.235.26.158963 ressemble malheureusement a une IP
12.13.14.58.96
(0)2.13.14.58.96
(1)2.13.14.58.96
toto (0) 123.456-789
toto (0) 123.456.789
toto 0 123.456-789
toto 0 123.456.789
***** 19 lignes trouvees *****
 
***********************************
1.c : lignes contenant trois points
***********************************
C'est dur...
cette ligne contient 3 points ......
***** 2 lignes trouvees *****
 
**********************************************************************
1.d : lignes contenant des nombres hexadecimaux separes par des blancs
**********************************************************************
Cette ligne contient 1 chiffre et une majuscule
celle ci ne contient que le chiffre 9 et pas de majuscule
4444
Aaa4
cette ligne contient 3 points ......
cette ligne . ne contient pas . la ponctuation 3 points.
Un nombre hexadecimal : AE456
FFF est un hexadecimal
cette ligne contient 124EF il est hexadecimal
voila un mot qui contient au moins 12 caracteres alphanumeriques 1a2bc3d4e5f6
1a2bc3d4e5f6g7 est un mot qui contient 14 caracteres alphanumeriques
Voila un mot 1a2bc3d4e5f6g7 il contient 14 caracteres alphanumeriques
1a2bc3d4e5 a 10 caracteres
cette ligne a contient a 5 fois a la lettre a
aaaaaaaaaaaaaaa
la ligne suivante ne contient que des a et des espaces
a a a a              aaaa    aa  
Ceci ressemble a une adresse IP : 123.456.789.145
2369.235.26.158963 ressemble malheureusement a une IP
01 24 58 96 52
41 52 69 78 56
12 36 98 74 56 12
78 96 32 85 41fgtr
Tel : 41 52 69 78 56
Tel : (0)1 52 69 78 56
(1)2 36 98 74 56 12
(0)1 24 58 96 52
toto (0) 123 456 789
toto (0) 123 456 789 titi
toto 0 123.456-789
toto 1 123-456-789
toto 0 123.456.789
***** 32 lignes trouvees *****
 
**********************************************************************
1.e : lignes contenant un mot d'au moins 12 caracteres alphanumeriques
**********************************************************************
voila un mot qui contient au moins 12 caracteres alphanumeriques 1a2bc3d4e5f6
1a2bc3d4e5f6g7 est un mot qui contient 14 caracteres alphanumeriques
Voila un mot 1a2bc3d4e5f6g7 il contient 14 caracteres alphanumeriques
aaaaaaaaaaaaaaa
2369.235.26.158963 ressemble malheureusement a une IP
***** 5 lignes trouvees *****
 
*******************************************************************************
1.f : lignes contenant exactement 5 lettres a (pas nécessairement successives)
*******************************************************************************
1a2bc3d4e5f6g7 est un mot qui contient 14 caracteres alphanumeriques
cette ligne a contient a 5 fois a la lettre a
***** 2 lignes trouvees *****
 
**********************************************
1.g : lignes contenant des crochets ( ] ou [ )
**********************************************
cette ligne contient des [
] cette ligne aussi
capitaine [] est tres mechant  
***** 3 lignes trouvees *****
 
**********************************************************
1.h : lignes ne contenant que des lettres a et des espaces
**********************************************************
aaaaaaaaaaaaaaa
                 
a a a a              aaaa    aa  
***** 3 lignes trouvees *****
 
*******************************************************************
1.i : lignes contenant quelque chose qui ressemble a une adresse IP
*******************************************************************
Ceci ressemble a une adresse IP : 123.456.789.145
Ceci aussi : 12.456.7.14
1.45.9.14 est une IP
totoAUneIPfixeQuiEst1.369.258.14IlEnEstContent
2369.235.26.158963 ressemble malheureusement a une IP
12.13.14.58.96
(0)2.13.14.58.96
(1)2.13.14.58.96
***** 8 lignes trouvees *****
 
******************
2.a : lignes vides
******************
 
 
 
 
***** 4 lignes trouvees *****
 
*********************
2.b : lignes blanches
*********************
                 
***** 1 lignes trouvees *****
 
**********************
2.c : lignes non vides
**********************
**********************************************
LP ASR
PERL
Fichier test pour les expressions regulieres
Auteur : GB
Revision : 11/11/2010
***********************************************
cette ligne ne contient ni chiffre ni majuscule
Cette ligne contient 1 chiffre et une majuscule
Celle ci ne contient qu'une majuscule
celle ci ne contient que le chiffre 9 et pas de majuscule
4444
MMMM
Aaa4
zz lm :
Cette ligne termine par un point.
C'est dur...
. premiere partie
on fait le . ?
..
cette ligne contient 3 points ......
cette ligne . ne contient pas . la ponctuation 3 points.
Un nombre hexadecimal : AE456
FFF est un hexadecimal
cette ligne contient 124EF il est hexadecimal
voila un mot qui contient au moins 12 caracteres alphanumeriques 1a2bc3d4e5f6
1a2bc3d4e5f6g7 est un mot qui contient 14 caracteres alphanumeriques
Voila un mot 1a2bc3d4e5f6g7 il contient 14 caracteres alphanumeriques
1a2bc3d4e5 a 10 caracteres
cette ligne a contient a 5 fois a la lettre a
aaaaaaaaaaaaaaa
cette ligne contient des [
] cette ligne aussi
capitaine [] est tres mechant  
la ligne suivante ne contient que des espaces
                 
la ligne suivante ne contient que des a et des espaces
a a a a              aaaa    aa  
Ceci ressemble a une adresse IP : 123.456.789.145
Ceci aussi : 12.456.7.14
1.45.9.14 est une IP
totoAUneIPfixeQuiEst1.369.258.14IlEnEstContent
2369.235.26.158963 ressemble malheureusement a une IP
01 24 58 96 52
41 52 69 78 56
12 36 98 74 56 12
12.13.14.58.96
78 96 32 85 41fgtr
01-23-45-67-89
Tel : 41 52 69 78 56
(0)1-23-45-67-89
Tel : (0)1 52 69 78 56
(1)2 36 98 74 56 12
(0)2.13.14.58.96
(0)1 24 58 96 52
(1)2.13.14.58.96
(0)123456
toto (0) 123 456 789
toto (0) 123 456 789 titi
bisous
toto (0) 123.456-789
toto (1) 123-456-789
toto (0) 123.456.789
toto 0 123.456-789
toto 1 123-456-789
toto 0 123.456.789
***** 66 lignes trouvees *****
 
****************************************
3.a : lignes qui ne contiennent pas de a
****************************************
**********************************************
 
LP ASR
PERL
Fichier test pour les expressions regulieres
Auteur : GB
Revision : 11/11/2010
 
***********************************************
 
4444
MMMM
zz lm :
C'est dur...
..
cette ligne contient 3 points ......
cette ligne contient des [
                 
1.45.9.14 est une IP
totoAUneIPfixeQuiEst1.369.258.14IlEnEstContent
01 24 58 96 52
41 52 69 78 56
12 36 98 74 56 12
12.13.14.58.96
78 96 32 85 41fgtr
01-23-45-67-89
Tel : 41 52 69 78 56
(0)1-23-45-67-89
Tel : (0)1 52 69 78 56
(1)2 36 98 74 56 12
(0)2.13.14.58.96
(0)1 24 58 96 52
(1)2.13.14.58.96
(0)123456
toto (0) 123 456 789
toto (0) 123 456 789 titi
bisous
toto (0) 123.456-789
toto (1) 123-456-789
toto (0) 123.456.789
toto 0 123.456-789
toto 1 123-456-789
toto 0 123.456.789
 
***** 44 lignes trouvees *****
 
***********************************************
3.b : lignes qui ne contiennent pas des espaces
***********************************************
**********************************************
 
PERL
 
***********************************************
 
4444
MMMM
Aaa4
..
aaaaaaaaaaaaaaa
totoAUneIPfixeQuiEst1.369.258.14IlEnEstContent
12.13.14.58.96
01-23-45-67-89
(0)1-23-45-67-89
(0)2.13.14.58.96
(1)2.13.14.58.96
(0)123456
bisous
 
***** 20 lignes trouvees *****
 
**********************************************************
3.c : lignes qui ne contiennent pas des chiffres décimaux
**********************************************************
**********************************************
 
LP ASR
PERL
Fichier test pour les expressions regulieres
Auteur : GB
 
***********************************************
 
cette ligne ne contient ni chiffre ni majuscule
Celle ci ne contient qu'une majuscule
MMMM
zz lm :
Cette ligne termine par un point.
C'est dur...
. premiere partie
on fait le . ?
..
FFF est un hexadecimal
aaaaaaaaaaaaaaa
cette ligne contient des [
] cette ligne aussi
capitaine [] est tres mechant  
la ligne suivante ne contient que des espaces
                 
la ligne suivante ne contient que des a et des espaces
a a a a              aaaa    aa  
bisous
 
***** 29 lignes trouvees *****
 
*******************************************************************************
4 : lignes qui débutent par un numéro de téléphone au format 01 23 45 67 89
*******************************************************************************
01 24 58 96 52
41 52 69 78 56
12 36 98 74 56 12
78 96 32 85 41fgtr
***** 4 lignes trouvees *****
 
***********************************************************
5 : idem 4 mais on peut avoir . ou - a la place des espaces
***********************************************************
01 24 58 96 52
41 52 69 78 56
12 36 98 74 56 12
12.13.14.58.96
78 96 32 85 41fgtr
01-23-45-67-89
***** 6 lignes trouvees *****
 
******************************************************
6 : idem 5 mais le 0 peut être entoure de parentheses
******************************************************
01 24 58 96 52
01-23-45-67-89
(0)1-23-45-67-89
(0)2.13.14.58.96
(0)1 24 58 96 52
***** 5 lignes trouvees *****
 
************************************************************************
7 : terminent par un tel au format 0 123 456 789, espaces, - ou . et (0)
************************************************************************
toto (0) 123 456 789
toto (0) 123.456-789
toto (0) 123.456.789
toto 0 123.456-789
toto 0 123.456.789
***** 5 lignes trouvees *****

Reply

Marsh Posté le 07-01-2015 à 20:46:25   

Reply

Marsh Posté le 07-01-2015 à 20:51:08    

Et il est ou le début de ton code?
Parce que poster un exo en priant qu'on fasse le boulot à ta place, ça marche pas ici.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-01-2015 à 22:45:55    

gilou a écrit :

Et il est ou le début de ton code?
Parce que poster un exo en priant qu'on fasse le boulot à ta place, ça marche pas ici.
 
A+,


 
Bsr, je suis désolée. Je voulais seulement avoir la méthodologie pour résoudre cet exercice au vue de mes difficultés.
 

Code :
  1. # ouverture du fichier de test et stockage des lignes dans @lignes
  2. open DATA, "< ./textes/File-test-Regexp.txt"; # ouverture du fichier de test en lecture
  3. while ($l = <DATA> ) # tant qu'il y a des données dans DATA
  4. {
  5. chomp($l);
  6. push @lignes,$l; # stockage dans la liste
  7. }
  8. close DATA; # fermeture du fichier
  9. # début de l'utilisation des expressions régulières
  10. # recherche basique d'un motif
  11. print "\n\n" . "*" x 80;
  12. print "\nAffichage des lignes contenant de, ie le motif /de/";
  13. print "\n" . "*" x 80;
  14. foreach $l (@lignes) # pour chaque ligne du fichier
  15. {
  16. if ($l=~ /de/) # si la ligne contient de...
  17.  {
  18.  print "\n$l"; #... on l'affiche
  19.  }
  20. }
  21. # recherche basique d'un motif
  22. print "\n\n" . "*" x 80;
  23. print "\nAffichage des lignes ne contenant pas de r, utiliser la négation de =~, ie !~";
  24. print "\n" . "*" x 80;
  25. foreach $l (@lignes) # pour chaque ligne du fichier
  26. {
  27. if ($l!~ /r/) # si la ligne ne contient pas r...
  28.  {
  29.  print "\n$l"; #... on l'affiche
  30.  }
  31. }
  32. # recherche d'un motif en début de chaine avec ^
  33. # l'accent circonflexe en début de motif signifie qu'on doit le trouver en début de chaîne
  34. print "\n\n" . "*" x 80;
  35. print "\nAffichage des lignes débutant par Passe, ie le motif /^Passe/";
  36. print "\n" . "*" x 80;
  37. foreach $l (@lignes) # pour chaque ligne du fichier
  38. {
  39. if ($l=~ /^Passe/) # si la ligne débute par Passe...
  40.  {
  41.  print "\n$l"; #... on l'affiche
  42.  }
  43. }
  44. # recherche d'un motif en fin de chaine avec $
  45. # le $ après un motif signifie qu'on doit le trouver en fin de chaîne
  46. print "\n\n" . "*" x 80;
  47. print "\nAffichage des lignes finissant par se, ie le motif /se\$/";
  48. print "\n" . "*" x 80;
  49. foreach $l (@lignes) # pour chaque ligne du fichier
  50. {
  51. if ($l=~ /se$/) # si la ligne termine par se...
  52.  {
  53.  print "\n$l"; #... on l'affiche
  54.  }
  55. }
  56. # recherche d'un motif contenant un caractère spécial
  57. # les caractères spéciaux sont ^ $ / . \ ? + * ( ) [ ]  { } |
  58. # pour chercher un de ces caractères, il faut le précéder d'un \
  59. print "\n\n" . "*" x 80;
  60. print "\nAffichage des lignes contenant un point d'interrogation, ie le motif /\\?/";
  61. print "\n" . "*" x 80;
  62. foreach $l (@lignes) # pour chaque ligne du fichier
  63. {
  64. if ($l=~ /\?/) # si la ligne contient ?...
  65.  {
  66.  print "\n$l"; #... on l'affiche
  67.  }
  68. }
  69. # recherche d'un /, le motif est donc /\//
  70. print "\n\n" . "*" x 80;
  71. print "\nAffichage des lignes contenant un slash, ie le motif /\\//";
  72. print "\n" . "*" x 80;
  73. foreach $l (@lignes) # pour chaque ligne du fichier
  74. {
  75. if ($l=~ /\//) # si la ligne contient /...
  76.  {
  77.  print "\n$l"; #... on l'affiche
  78.  }
  79. }
  80. # recherche d'un motif ou d'un autre avec |
  81. print "\n\n" . "*" x 80;
  82. print "\nAffichage des lignes contenant /se/ ou /es/, ie le motif /se|es/";
  83. print "\n" . "*" x 80;
  84. foreach $l (@lignes) # pour chaque ligne du fichier
  85. {
  86. if ($l=~ /se|es/) # si la ligne contient se ou es...
  87.  {
  88.  print "\n$l"; #... on l'affiche
  89.  }
  90. }
  91. # recherche d'un motif en ignorant la casse, il faut utiliser le modificateur i (ignore)
  92. # il faut le placer après le deuxième /
  93. # exemple pour chercher log ou LOG ou Log ou LoG etc...., le motif est /log/i
  94. print "\n\n" . "*" x 80;
  95. print "\nAffichage des lignes contenant le mot log écrit";
  96. print "\nindifféremment avec des majuscules ou minuscules";
  97. print "\nie contenant le motif /log/i ";
  98. print "\n" . "*" x 80;
  99. foreach $l (@lignes) # pour chaque ligne du fichier
  100. {
  101. if ($l=~ /log/i) # si la ligne contient log ou LOG ou LoG ...
  102.  {
  103.  print "\n$l"; #... on l'affiche
  104.  }
  105. }
  106. # recherche d'un motif avec plusieurs choix pour un même caractère en utilisant les []
  107. print "\n\n" . "*" x 80;
  108. print "\nAffichage des lignes contenant Perl ou perl, ie le motif /[Pp]erl/";
  109. print "\n" . "*" x 80;
  110. foreach $l (@lignes) # pour chaque ligne du fichier
  111. {
  112. if ($l=~ /[Pp]erl/) # si la ligne contient Perl ou perl...
  113.  {
  114.  print "\n$l"; #... on l'affiche
  115.  }
  116. }
  117. # dans les crochets, on peut mettre des listes.
  118. # Exemple pour rechercher des lignes contenant des chiffres, utiliser le motif : /[0-9]/
  119. print "\n\n" . "*" x 80;
  120. print "\nAffichage des lignes contenant des chiffres, ie le motif /[0-9]/";
  121. print "\n" . "*" x 80;
  122. foreach $l (@lignes) # pour chaque ligne du fichier
  123. {
  124. if ($l=~ /[0-9]/) # si la ligne contient des chiffres...
  125.  {
  126.  print "\n$l"; #... on l'affiche
  127.  }
  128. }
  129. # Exemple pour rechercher des lignes contenant des lettres min ou maj, utiliser le motif : /[a-zA-Z]/
  130. print "\n\n" . "*" x 80;
  131. print "\nAffichage des lignes contenant des lettre, ie le motif /[a-zA-Z]/";
  132. print "\n" . "*" x 80;
  133. foreach $l (@lignes) # pour chaque ligne du fichier
  134. {
  135. if ($l=~ /[a-zA-Z]/) # si la ligne contient des lettres...
  136.  {
  137.  print "\n$l"; #... on l'affiche
  138.  }
  139. }
  140. # Exemple pour rechercher des lignes débutant par une majuscule suivie d'un chiffre : /^[A-Z][0-9]/
  141. print "\n\n" . "*" x 80;
  142. print "\nAffichage des lignes débutant par une majuscule suivie d'un chiffre";
  143. print "\nie le motif : /^[A-Z][0-9]/";
  144. print "\n" . "*" x 80;
  145. foreach $l (@lignes) # pour chaque ligne du fichier
  146. {
  147. if ($l=~ /^[A-Z][0-9]/) # si la ligne débute par une majuscule suivie d'un chiffre : /^[A-Z][0-9]/
  148.  {
  149.  print "\n$l"; #... on l'affiche
  150.  }
  151. }
  152. # les raccourcis pour les listes
  153. # \d n'importe quel chiffre <-> [0-9]
  154. # \D tout sauf un chiffre <-> [^\d]
  155. # \s un espace, une tabulation ou un retour à la ligne
  156. # \S tout sauf un espace, une tabulation ou un retour à la ligne <-> [^\S]
  157. # \w un mot : toute suite de caractères délimitée par des espaces, tabulation ou retour à la ligne
  158. # Exemple pour rechercher des lignes contenant au moins un mot : /\w/
  159. print "\n\n" . "*" x 80;
  160. print "\nAffichage des lignes contenant contenant au moins un mot : ie le motif /\\w/";
  161. print "\n" . "*" x 80;
  162. foreach $l (@lignes) # pour chaque ligne du fichier
  163. {
  164. if ($l=~ /\w/) # si on trouve un mot...
  165.  {
  166.  print "\n$l"; #... on l'affiche
  167.  }
  168. }
  169. # Exemple pour rechercher des lignes ne contenant aucun mot : !~ /\w/
  170. print "\n\n" . "*" x 80;
  171. print "\nAffichage des lignes ne contenant aucun mot : ie le motif  !~ /\\w/";
  172. print "\n" . "*" x 80;
  173. foreach $l (@lignes) # pour chaque ligne du fichier
  174. {
  175. if ($l!~ /\w/) # si on ne trouve aucun mot...
  176.  {
  177.  print "\n$l"; #... on l'affiche
  178.  }
  179. }
  180. # Exemple pour rechercher des lignes contenant un chiffre suivi d'un espace
  181. print "\n\n" . "*" x 80;
  182. print "\nAffichage des lignes contenant un chiffre suivi d'un espace";
  183. print "\nie le motif /\\d\\s/";
  184. print "\n" . "*" x 80;
  185. foreach $l (@lignes) # pour chaque ligne du fichier
  186. {
  187. if ($l=~ /\d\s/) # si on trouve un chiffre suivi d'un espace...
  188.  {
  189.  print "\n$l"; #... on l'affiche
  190.  }
  191. }
  192. # éviter un caractère, l'opérateur sauf : [^]
  193. # Exemple pour rechercher des lignes contenant un o mais pas suivi d'un i, utiliser le motif : /o[^i]/
  194. print "\n\n" . "*" x 80;
  195. print "\nAffichage des lignes contenant un o mais pas suivi d'un i, ie le motif /o[^i]/";
  196. print "\n" . "*" x 80;
  197. foreach $l (@lignes) # pour chaque ligne du fichier
  198. {
  199. if ($l=~ /o[^i]/) # si aucun des o de la ligne n'est suivi d'un i...
  200.  {
  201.  print "\n$l"; #... on l'affiche
  202.  }
  203. }
  204. # quantificateurs {}
  205. # Exemple pour rechercher des lignes contenant 3 chiffres consécutifs, utiliser le motif : /\d{3}/
  206. print "\n\n" . "*" x 80;
  207. print "\nAffichage des lignes contenant 3 chiffres consécutifs, ie le motif /\\d{3}/";
  208. print "\n" . "*" x 80;
  209. foreach $l (@lignes) # pour chaque ligne du fichier
  210. {
  211. if ($l=~ /\d{3}/) # si on rencontre 3 chiffres consécutifs...
  212.  {
  213.  print "\n$l"; #... on l'affiche
  214.  }
  215. }
  216. # quantificateurs {}
  217. # Exemple pour rechercher des lignes contenant au moins 4 chiffres consécutifs utiliser le motif : /\d{4,}/
  218. print "\n\n" . "*" x 80;
  219. print "\nAffichage des lignes contenant au moins 4 chiffres consécutifs";
  220. print "\nie le motif /\\d{4,}/";
  221. print "\n" . "*" x 80;
  222. foreach $l (@lignes) # pour chaque ligne du fichier
  223. {
  224. if ($l=~ /\d{4,}/) # si on rencontre au moins 4 chiffres consécutifs...
  225.  {
  226.  print "\n$l"; #... on l'affiche
  227.  }
  228. }
  229. # quantificateurs {}
  230. # Exemple pour rechercher des lignes contenant entre 3 et 4 chiffres consécutifs au plus...
  231. print "\n\n" . "*" x 80;
  232. print "\nAffichage des lignes contenant entre 3 et 4 chiffres consécutifs au plus";
  233. print "\nIl faut enlever celles qui en ont au moins 5 à celles qui en ont au moins 3";
  234. print "\nie : if (\$l=~ /\\d{3,}/ and \$l!~ /\\d{5,}/)";
  235. print "\n" . "*" x 80;
  236. foreach $l (@lignes) # pour chaque ligne du fichier
  237. {
  238. if ($l=~ /\d{3,}/ and $l!~ /\d{5,}/) # si on rencontre entre 3 et 4 chiffres consécutifs au plus...
  239.  {
  240.  print "\n$l"; #... on l'affiche
  241.  }
  242. }
  243. #ou encore
  244. # quantificateurs {}
  245. # Exemple pour rechercher des lignes contenant entre 3 et 4 chiffres consécutifs au plus...
  246. print "\n\n" . "*" x 80;
  247. print "\nAffichage des lignes contenant entre 3 et 4 chiffres consécutifs au plus";
  248. print "\nIl faut prendre celles qui en ont 3 ou 4 mais ni précédé, ni suivi d'un chiffre";
  249. print "\nie : if (\$l=~ /\\D\\d{3,4}\\D/)";
  250. print "\n" . "*" x 80;
  251. foreach $l (@lignes) # pour chaque ligne du fichier
  252. {
  253. if ($l=~ /\D\d{3,4}\D/) # si on rencontre entre 3 et 4 chiffres consécutifs...
  254.  {
  255.  print "\n$l"; #... on l'affiche
  256.  }
  257. }
  258. # quantificateurs ? + *
  259. # ? 0 ou une fois : /\d?/ <-> 0 ou 1 chiffre
  260. # + 1 ou plusieurs fois : /\d+/ <-> 1 chiffre ou plus <-> /\d{1,}/
  261. # * 0 ou une ou plusieurs fois : /\d*/ <-> 0, 1 ou n chiffres
  262. # Exemple pour rechercher des lignes terminant par .jpeg ou . jpg en majuscules ou minuscules : /\.jpe?g$/i
  263. print "\n\n" . "*" x 80;
  264. print "\nAffichage des lignes terminant par .jpeg ou . jpg en majuscules ou minuscules";
  265. print "\nie le motif : /\\.jpe?g\$/i";
  266. print "\n" . "*" x 80;
  267. foreach $l (@lignes) # pour chaque ligne du fichier
  268. {
  269. if ($l=~ /\.jpe?g$/i) # si on termine par .jpeg ou . jpg en majuscules ou minuscules...
  270.  {
  271.  print "\n$l"; #... on l'affiche
  272.  }
  273. }
  274. # Exemple pour rechercher des lignes débutant par au moins un . et peut-être plus : /^\.+/
  275. print "\n\n" . "*" x 80;
  276. print "\nAffichage des lignes débutant par au moins un . et peut-être plus";
  277. print "\nie le motif : /^\\.+/";
  278. print "\n" . "*" x 80;
  279. foreach $l (@lignes) # pour chaque ligne du fichier
  280. {
  281. if ($l=~ /^\.+/) # si on débute par au moins un . et peut-être plus
  282.  {
  283.  print "\n$l"; #... on l'affiche
  284.  }
  285. }
  286. # Utilisation des parenthèses pour le regroupement :
  287. # recherche des chaines contenant au moins une fois la syllabe "to"
  288. print "\n\n" . "*" x 80;
  289. print "\nAffichage des lignes contenant au moins une fois la syllabe \"to\"";
  290. print "\nie le motif : /(to)+/";
  291. print "\n" . "*" x 80;
  292. foreach $l (@lignes) # pour chaque ligne du fichier
  293. {
  294. if ($l=~ /(to)+/) # si on contient au moins une fois la syllabe "to"
  295.  {
  296.  print "\n$l"; #... on l'affiche
  297.  }
  298. }
  299. # Exemple pour rechercher des lignes débutant par Login ou login, éventuellement précédé d'un ou plusieurs espaces
  300. # motif : /^\s*[Ll]ogin/
  301. print "\n\n" . "*" x 80;
  302. print "\nAffichage des lignes terminant débutant par Login ou login";
  303. print "\néventuellement précédé d'un ou plusieurs espaces";
  304. print "\nie le motif : /^\\s*[Ll]ogin/";
  305. print "\n" . "*" x 80;
  306. foreach $l (@lignes) # pour chaque ligne du fichier
  307. {
  308. if ($l=~ /^\s*[Ll]ogin/) # si on débute par Login ou login, éventuellement précédé d'un ou plusieurs espaces
  309.  {
  310.  print "\n$l"; #... on l'affiche
  311.  }
  312. }
  313. # Le joker, c'est le point, il remplace tout ce qu'on veut
  314. # Exemple pour rechercher des lignes contenant une date au format dd/mm/aaaa, puis plus loin, une heure au format hh:mm
  315. # motif : /\d\d\/\d\d\/\d\d\d\d.+\d\d:\d\d/
  316. print "\n\n" . "*" x 80;
  317. print "\nAffichage des lignes contenant une date au format dd/mm/aaaa,";
  318. print "\npuis plus loin, une heure au format hh:mm";
  319. print "\nie le motif : /\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d.+\\d\\d:\\d\\d/";
  320. print "\n" . "*" x 80;
  321. foreach $l (@lignes) # pour chaque ligne du fichier
  322. {
  323. if ($l=~ /\d\d\/\d\d\/\d\d\d\d.+\d\d:\d\d/)
  324. # si on troube une date au format dd/mm/aaaa, puis plus loin, une heure au format hh:mm
  325.  {
  326.  print "\n$l"; #... on l'affiche
  327.  }
  328. }
  329. print "\n\n" . "*" x 80;
  330. print "\nAffichage des lignes commençant par une lettre et terminant par un chiffre";
  331. print "\nie le motif : /^[a-zA-Z].*[0-9]\$/";
  332. print "\n" . "*" x 80;
  333. foreach $l (@lignes) # pour chaque ligne du fichier
  334. {
  335. if ($l=~ /^[a-zA-Z].*[0-9]$/) # si on commence par une lettre et on termine par un chiffre...
  336.  {
  337.  print "\n$l"; #... on l'affiche
  338.  }
  339. }
  340. print "\n\nAu revoir\n\n";


 
J'ai ce début de code, qui me permet de classer les fichiers par type.


Message édité par laisso le 07-01-2015 à 22:48:25
Reply

Marsh Posté le 08-01-2015 à 05:10:38    

Sauf que ton début de code, c'est un peu n'importe quoi, et surtout, ça n'essaye pas de répondre à ton exercice.
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my @infos = ({title => "1.a : lignes contenant des chiffres ou des majuscules", regexp => '[0-9A-Z]' },
  7.          {title => "1.b : lignes contenant des points" , regexp => '\.'},
  8.          {title => "1.c : lignes contenant trois points", regexp => '\.{3}'},
  9.          {title => "1.d : lignes contenant des nombres hexadecimaux separes par des blancs", regexp => '(^|\s)[0-9A-Fa-f]+(\s|$)'},
  10.          {title => "1.e : lignes contenant un mot d'au moins 12 caracteres alphanumeriques", regexp => '(^|\s)[0-9A-Za-z]{12,}(\s|$)'},
  11.          {title => "1.f : lignes contenant exactement 5 lettres a (pas nécessairement successives)", regexp => '^[^a]*a[^a]*a[^a]*a[^a]*a[^a]*a[^a]*$'},
  12.          {title => "1.g : lignes contenant des crochets ( ] ou [ )", regexp => '\[|\]'},
  13.          {title => "1.h : lignes ne contenant que des lettres a et des espaces ", regexp => '^[a\s]+$'},
  14.          {title => "1.i : lignes contenant quelque chose qui ressemble a une adresse IP", regexp => '\d{1,3}(\.\d{1,3}){3}'},
  15.          {title => "2.a : lignes vides", regexp => '^$'},
  16.          {title => "2.b : lignes blanches", regexp => '^\s+$'},
  17.          {title => "2.c : lignes non vides", regexp => '^.+$'},
  18.          {title => "3.a : lignes qui ne contiennent pas de a", regexp => '^[^a]*$'},
  19.          {title => "3.b : lignes qui ne contiennent pas des espaces", regexp => '^\S*$'},
  20.          {title => "3.c : lignes qui ne contiennent pas des chiffres décimaux", regexp => '^[^0-9]*$'},
  21.          {title => "4 : lignes qui débutent par un numéro de téléphone au format 01 23 45 67 89", regexp => '^\d{2}(\s\d{2}){4}'},
  22.          {title => "5 : idem 4 mais on peut avoir . ou - a la place des espaces", regexp => '^\d{2}([-\s\.]\d{2}){4}'},
  23.          {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => '^(\(0\)|\d)\d([-\s\.]\d{2}){4}'},
  24.          {title => "7 : terminent par un tel au format 0 123 456 789, espaces, - ou . et (0)", regexp => '(\(0\)|0)([-\s\.]\d{3}){3}$'});
  25.  
  26. sub afficheTitre {
  27.  my $titre = shift;
  28.  my $len = length($titre);
  29.  print "*" x $len, "\n";
  30.  print $titre, "\n";
  31.  print "*" x $len, "\n";
  32. }
  33.  
  34. sub afficheLignes {
  35.  my $re = shift;
  36.  my @lines = grep /$re/, @_;
  37.  print $_ foreach (@lines);
  38.  print "*" x 5, " ", 0+@lines, " ", "lignes trouvees", " ", "*" x 5, "\n";
  39. }
  40.  
  41. open my $fin, "<", "laisso.txt";
  42. my @lines = <$fin>;
  43. close $fin;
  44.  
  45. foreach (@infos) {
  46.  afficheTitre($_->{title});
  47.  afficheLignes($_->{regexp}, @lines);
  48.  print "\n";
  49. }


Un truc comme ça devrait le faire, j'ai pas vérifié toutes les regexp.
Au fait, son énoncé pour  
6 : idem 5 mais le 0 peut être entoure de parentheses  
est faux vis a vis de sa sortie exemple (il ne fait pas idem 5 mais ne choisit que ceux démarrant par 0  ou (0))
 
A+,


Message édité par gilou le 08-01-2015 à 05:11:01

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-01-2015 à 12:10:01    

Les deux trucs que tu ne connais peut être pas et qui simplifient la vie ici:
1) @lines = <$fin>;
ça remplit @lines avec les lignes du fichier ouvert de handle $fin.
A ne pas employer avec un fichier trop gros pour tenir en mémoire (mais on en est bien bien loin ici)
2) @searched = grep /$regexp/, @lines;
remplit @searched avec les lignes de @lines qui matchent l'expression régulière $regexp
 
Pour le reste, tout était dans l'énoncé:
On bouclait sur un certain nombre de titres, pour chaque titre, on l'affiche avec une fonction afficheTitre à écrire, et on filtre les lignes qui matchent une certaine expression régulière et on les affiche avec une fonction afficheLignes à écrire
 
A+,

Reply

Marsh Posté le 08-01-2015 à 15:51:38    

On peut améliorer un peut ça:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my @infos = (
  7.          {title => "1.a : lignes contenant des chiffres ou des majuscules", regexp => qr/[0-9A-Z]/ },
  8.          {title => "1.b : lignes contenant des points" , regexp => qr/\./},
  9.          {title => "1.c : lignes contenant trois points", regexp => qr/\.{3}/},
  10.          {title => "1.d : lignes contenant des nombres hexadecimaux separes par des blancs", regexp => qr/(^|\s)[0-9A-F]+(\s|$)/i},
  11.          {title => "1.e : lignes contenant un mot d/au moins 12 caracteres alphanumeriques", regexp => qr/(^|\s)[0-9A-Z]{12,}(\s|$)/i},
  12.          {title => "1.f : lignes contenant exactement 5 lettres a (pas nécessairement successives)", regexp => qr/^([^a]*a){5}[^a]*$/},
  13.          {title => "1.g : lignes contenant des crochets ( ] ou [ )", regexp => qr/\[|\]/},
  14.          {title => "1.h : lignes ne contenant que des lettres a et des espaces ", regexp => qr/^[a\s]+$/},
  15.          {title => "1.i : lignes contenant quelque chose qui ressemble a une adresse IP", regexp => qr/\d{1,3}(\.\d{1,3}){3}/},
  16.          {title => "2.a : lignes vides", regexp => qr/^$/},
  17.          {title => "2.b : lignes blanches", regexp => qr/^\s+$/},
  18.          {title => "2.c : lignes non vides", regexp => qr/^.+$/},
  19.          {title => "3.a : lignes qui ne contiennent pas de a", regexp => qr/^[^a]*$/},
  20.          {title => "3.b : lignes qui ne contiennent pas des espaces", regexp => qr/^\S*$/},
  21.          {title => "3.c : lignes qui ne contiennent pas des chiffres décimaux", regexp => qr/^[^0-9]*$/},
  22.          {title => "4 : lignes qui débutent par un numéro de téléphone au format 01 23 45 67 89", regexp => qr/^\d{2}(\s\d{2}){4}/},
  23.          {title => "5 : idem 4 mais on peut avoir . ou - a la place des espaces", regexp => qr/^\d{2}([-\s\.]\d{2}){4}/},
  24.          # {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|\d)\d([-\s\.]\d{2}){4}/},
  25.          # au vu de son exemple, doit commencer par 0
  26.          {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|0)\d([-\s\.]\d{2}){4}/},
  27.          {title => "7 : terminent par un tel au format 0 123 456 789, espaces, - ou . et (0)", regexp => qr/(\(0\)|0)([-\s\.]\d{3}){3}$/}
  28.         );
  29.  
  30. sub afficheTitre {
  31.  my $titre = shift;
  32.  my $stars = "*" x length($titre);
  33.  print $stars, "\n";
  34.  print $titre, "\n";
  35.  print $stars, "\n";
  36. }
  37.  
  38. sub afficheLignes {
  39.  my $stars = "*" x 5;
  40.  my $regexp = shift;
  41.  my @lines = grep /$regexp/, @_;
  42.  map {print "$_\n"} @lines;
  43.  print "$stars ", scalar(@lines), " lignes trouvees $stars\n";
  44. }
  45.  
  46. open my $fin, "<", "laisso.txt";
  47. my @lines = <$fin>;
  48. chomp @lines;
  49. close $fin;
  50.  
  51. afficheTitre("PERL : Fichier de sortie de l'exercice 2 du TP4" );
  52. foreach (@infos) {
  53.  print "\n";
  54.  afficheTitre($_->{title});
  55.  afficheLignes($_->{regexp}, @lines);
  56. }


 
A+,

Message cité 2 fois
Message édité par gilou le 08-01-2015 à 16:05:15

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-01-2015 à 13:22:50    

gilou a écrit :

On peut améliorer un peut ça:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my @infos = (
  7.          {title => "1.a : lignes contenant des chiffres ou des majuscules", regexp => qr/[0-9A-Z]/ },
  8.          {title => "1.b : lignes contenant des points" , regexp => qr/\./},
  9.          {title => "1.c : lignes contenant trois points", regexp => qr/\.{3}/},
  10.          {title => "1.d : lignes contenant des nombres hexadecimaux separes par des blancs", regexp => qr/(^|\s)[0-9A-F]+(\s|$)/i},
  11.          {title => "1.e : lignes contenant un mot d/au moins 12 caracteres alphanumeriques", regexp => qr/(^|\s)[0-9A-Z]{12,}(\s|$)/i},
  12.          {title => "1.f : lignes contenant exactement 5 lettres a (pas nécessairement successives)", regexp => qr/^([^a]*a){5}[^a]*$/},
  13.          {title => "1.g : lignes contenant des crochets ( ] ou [ )", regexp => qr/\[|\]/},
  14.          {title => "1.h : lignes ne contenant que des lettres a et des espaces ", regexp => qr/^[a\s]+$/},
  15.          {title => "1.i : lignes contenant quelque chose qui ressemble a une adresse IP", regexp => qr/\d{1,3}(\.\d{1,3}){3}/},
  16.          {title => "2.a : lignes vides", regexp => qr/^$/},
  17.          {title => "2.b : lignes blanches", regexp => qr/^\s+$/},
  18.          {title => "2.c : lignes non vides", regexp => qr/^.+$/},
  19.          {title => "3.a : lignes qui ne contiennent pas de a", regexp => qr/^[^a]*$/},
  20.          {title => "3.b : lignes qui ne contiennent pas des espaces", regexp => qr/^\S*$/},
  21.          {title => "3.c : lignes qui ne contiennent pas des chiffres décimaux", regexp => qr/^[^0-9]*$/},
  22.          {title => "4 : lignes qui débutent par un numéro de téléphone au format 01 23 45 67 89", regexp => qr/^\d{2}(\s\d{2}){4}/},
  23.          {title => "5 : idem 4 mais on peut avoir . ou - a la place des espaces", regexp => qr/^\d{2}([-\s\.]\d{2}){4}/},
  24.          # {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|\d)\d([-\s\.]\d{2}){4}/},
  25.          # au vu de son exemple, doit commencer par 0
  26.          {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|0)\d([-\s\.]\d{2}){4}/},
  27.          {title => "7 : terminent par un tel au format 0 123 456 789, espaces, - ou . et (0)", regexp => qr/(\(0\)|0)([-\s\.]\d{3}){3}$/}
  28.         );
  29.  
  30. sub afficheTitre {
  31.  my $titre = shift;
  32.  my $stars = "*" x length($titre);
  33.  print $stars, "\n";
  34.  print $titre, "\n";
  35.  print $stars, "\n";
  36. }
  37.  
  38. sub afficheLignes {
  39.  my $stars = "*" x 5;
  40.  my $regexp = shift;
  41.  my @lines = grep /$regexp/, @_;
  42.  map {print "$_\n"} @lines;
  43.  print "$stars ", scalar(@lines), " lignes trouvees $stars\n";
  44. }
  45.  
  46. open my $fin, "<", "laisso.txt";
  47. my @lines = <$fin>;
  48. chomp @lines;
  49. close $fin;
  50.  
  51. afficheTitre("PERL : Fichier de sortie de l'exercice 2 du TP4" );
  52. foreach (@infos) {
  53.  print "\n";
  54.  afficheTitre($_->{title});
  55.  afficheLignes($_->{regexp}, @lines);
  56. }


 
A+,


 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. my @infos = (
  6.          {title => "1.a : lignes contenant des chiffres ou des majuscules", regexp => qr/[0-9A-Z]/ },
  7.          {title => "1.b : lignes contenant des points" , regexp => qr/\./},
  8.          {title => "1.c : lignes contenant trois points", regexp => qr/\.{3}/},
  9.          {title => "1.d : lignes contenant des nombres hexadecimaux separes par des blancs", regexp => qr/(^|\s)[0-9A-F]+(\s|$)/i},
  10.          {title => "1.e : lignes contenant un mot d/au moins 12 caracteres alphanumeriques", regexp => qr/(^|\s)[0-9A-Z]{12,}(\s|$)/i},
  11.          {title => "1.f : lignes contenant exactement 5 lettres a (pas nécessairement successives)", regexp => qr/^([^a]*a){5}[^a]*$/},
  12.          {title => "1.g : lignes contenant des crochets ( ] ou [ )", regexp => qr/\[|\]/},
  13.          {title => "1.h : lignes ne contenant que des lettres a et des espaces ", regexp => qr/^[a\s]+$/},
  14.          {title => "1.i : lignes contenant quelque chose qui ressemble a une adresse IP", regexp => qr/\d{1,3}(\.\d{1,3}){3}/},
  15.          {title => "2.a : lignes vides", regexp => qr/^$/},
  16.          {title => "2.b : lignes blanches", regexp => qr/^\s+$/},
  17.          {title => "2.c : lignes non vides", regexp => qr/^.+$/},
  18.          {title => "3.a : lignes qui ne contiennent pas de a", regexp => qr/^[^a]*$/},
  19.          {title => "3.b : lignes qui ne contiennent pas des espaces", regexp => qr/^\S*$/},
  20.          {title => "3.c : lignes qui ne contiennent pas des chiffres décimaux", regexp => qr/^[^0-9]*$/},
  21.          {title => "4 : lignes qui débutent par un numéro de téléphone au format 01 23 45 67 89", regexp => qr/^\d{2}(\s\d{2}){4}/},
  22.          {title => "5 : idem 4 mais on peut avoir . ou - a la place des espaces", regexp => qr/^\d{2}([-\s\.]\d{2}){4}/},
  23.          # {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|\d)\d([-\s\.]\d{2}){4}/},
  24.          # au vu de son exemple, doit commencer par 0
  25.          {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|0)\d([-\s\.]\d{2}){4}/},
  26.          {title => "7 : terminent par un tel au format 0 123 456 789, espaces, - ou . et (0)", regexp => qr/(\(0\)|0)([-\s\.]\d{3}){3}$/}
  27.         );
  28. sub afficheTitre {
  29. my $titre = shift;
  30. my $stars = "*" x length($titre);
  31. print $stars, "\n";
  32. print $titre, "\n";
  33. print $stars, "\n";
  34. }
  35. sub afficheLignes {
  36. my $stars = "*" x 5;
  37. my $regexp = shift;
  38. my @lines = grep /$regexp/, @_;
  39. map {print "$_\n"} @lines;
  40. print "$stars ", scalar(@lines), " lignes trouvees $stars\n";
  41. }
  42. open my $fin, "<", "RegExpTP4_Ex2.txt";
  43. my @lines = <$fin>;
  44. chomp @lines;
  45. close $fin;
  46. open (RAPPORT, ">>SortieRegExpTP4_Ex2.txt" );
  47. afficheTitre("PERL : Fichier de sortie de l'exercice 2 du TP4" );
  48. foreach (@infos) {
  49. print "\n";
  50. afficheTitre($_->{title});
  51. afficheLignes($_->{regexp}, @lines);


 
Il y a un fichier entrée et un fichier de sortie, j'ai donc rajouter une ligne avec les nons des 2 fichiers. Qu'en pensez vous?
 
Merci de votre aide!

Reply

Marsh Posté le 10-01-2015 à 14:19:30    

gilou a écrit :

On peut améliorer un peut ça:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my @infos = (
  7.          {title => "1.a : lignes contenant des chiffres ou des majuscules", regexp => qr/[0-9A-Z]/ },
  8.          {title => "1.b : lignes contenant des points" , regexp => qr/\./},
  9.          {title => "1.c : lignes contenant trois points", regexp => qr/\.{3}/},
  10.          {title => "1.d : lignes contenant des nombres hexadecimaux separes par des blancs", regexp => qr/(^|\s)[0-9A-F]+(\s|$)/i},
  11.          {title => "1.e : lignes contenant un mot d/au moins 12 caracteres alphanumeriques", regexp => qr/(^|\s)[0-9A-Z]{12,}(\s|$)/i},
  12.          {title => "1.f : lignes contenant exactement 5 lettres a (pas nécessairement successives)", regexp => qr/^([^a]*a){5}[^a]*$/},
  13.          {title => "1.g : lignes contenant des crochets ( ] ou [ )", regexp => qr/\[|\]/},
  14.          {title => "1.h : lignes ne contenant que des lettres a et des espaces ", regexp => qr/^[a\s]+$/},
  15.          {title => "1.i : lignes contenant quelque chose qui ressemble a une adresse IP", regexp => qr/\d{1,3}(\.\d{1,3}){3}/},
  16.          {title => "2.a : lignes vides", regexp => qr/^$/},
  17.          {title => "2.b : lignes blanches", regexp => qr/^\s+$/},
  18.          {title => "2.c : lignes non vides", regexp => qr/^.+$/},
  19.          {title => "3.a : lignes qui ne contiennent pas de a", regexp => qr/^[^a]*$/},
  20.          {title => "3.b : lignes qui ne contiennent pas des espaces", regexp => qr/^\S*$/},
  21.          {title => "3.c : lignes qui ne contiennent pas des chiffres décimaux", regexp => qr/^[^0-9]*$/},
  22.          {title => "4 : lignes qui débutent par un numéro de téléphone au format 01 23 45 67 89", regexp => qr/^\d{2}(\s\d{2}){4}/},
  23.          {title => "5 : idem 4 mais on peut avoir . ou - a la place des espaces", regexp => qr/^\d{2}([-\s\.]\d{2}){4}/},
  24.          # {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|\d)\d([-\s\.]\d{2}){4}/},
  25.          # au vu de son exemple, doit commencer par 0
  26.          {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|0)\d([-\s\.]\d{2}){4}/},
  27.          {title => "7 : terminent par un tel au format 0 123 456 789, espaces, - ou . et (0)", regexp => qr/(\(0\)|0)([-\s\.]\d{3}){3}$/}
  28.         );
  29.  
  30. sub afficheTitre {
  31.  my $titre = shift;
  32.  my $stars = "*" x length($titre);
  33.  print $stars, "\n";
  34.  print $titre, "\n";
  35.  print $stars, "\n";
  36. }
  37.  
  38. sub afficheLignes {
  39.  my $stars = "*" x 5;
  40.  my $regexp = shift;
  41.  my @lines = grep /$regexp/, @_;
  42.  map {print "$_\n"} @lines;
  43.  print "$stars ", scalar(@lines), " lignes trouvees $stars\n";
  44. }
  45.  
  46. open my $fin, "<", "laisso.txt";
  47. my @lines = <$fin>;
  48. chomp @lines;
  49. close $fin;
  50.  
  51. afficheTitre("PERL : Fichier de sortie de l'exercice 2 du TP4" );
  52. foreach (@infos) {
  53.  print "\n";
  54.  afficheTitre($_->{title});
  55.  afficheLignes($_->{regexp}, @lines);
  56. }


 
A+,


 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. my @infos = (
  6.          {title => "1.a : lignes contenant des chiffres ou des majuscules", regexp => qr/[0-9A-Z]/ },
  7.          {title => "1.b : lignes contenant des points" , regexp => qr/\./},
  8.          {title => "1.c : lignes contenant trois points", regexp => qr/\.{3}/},
  9.          {title => "1.d : lignes contenant des nombres hexadecimaux separes par des blancs", regexp => qr/(^|\s)[0-9A-F]+(\s|$)/i},
  10.          {title => "1.e : lignes contenant un mot d/au moins 12 caracteres alphanumeriques", regexp => qr/(^|\s)[0-9A-Z]{12,}(\s|$)/i},
  11.          {title => "1.f : lignes contenant exactement 5 lettres a (pas nécessairement successives)", regexp => qr/^([^a]*a){5}[^a]*$/},
  12.          {title => "1.g : lignes contenant des crochets ( ] ou [ )", regexp => qr/\[|\]/},
  13.          {title => "1.h : lignes ne contenant que des lettres a et des espaces ", regexp => qr/^[a\s]+$/},
  14.          {title => "1.i : lignes contenant quelque chose qui ressemble a une adresse IP", regexp => qr/\d{1,3}(\.\d{1,3}){3}/},
  15.          {title => "2.a : lignes vides", regexp => qr/^$/},
  16.          {title => "2.b : lignes blanches", regexp => qr/^\s+$/},
  17.          {title => "2.c : lignes non vides", regexp => qr/^.+$/},
  18.          {title => "3.a : lignes qui ne contiennent pas de a", regexp => qr/^[^a]*$/},
  19.          {title => "3.b : lignes qui ne contiennent pas des espaces", regexp => qr/^\S*$/},
  20.          {title => "3.c : lignes qui ne contiennent pas des chiffres décimaux", regexp => qr/^[^0-9]*$/},
  21.          {title => "4 : lignes qui débutent par un numéro de téléphone au format 01 23 45 67 89", regexp => qr/^\d{2}(\s\d{2}){4}/},
  22.          {title => "5 : idem 4 mais on peut avoir . ou - a la place des espaces", regexp => qr/^\d{2}([-\s\.]\d{2}){4}/},
  23.          # {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|\d)\d([-\s\.]\d{2}){4}/},
  24.          # au vu de son exemple, doit commencer par 0
  25.          {title => "6 : idem 5 mais le 0 peut être entoure de parentheses", regexp => qr/^(\(0\)|0)\d([-\s\.]\d{2}){4}/},
  26.          {title => "7 : terminent par un tel au format 0 123 456 789, espaces, - ou . et (0)", regexp => qr/(\(0\)|0)([-\s\.]\d{3}){3}$/}
  27.         );
  28. sub afficheTitre {
  29. my $titre = shift;
  30. my $stars = "*" x length($titre);
  31. print $stars, "\n";
  32. print $titre, "\n";
  33. print $stars, "\n";
  34. }
  35. sub afficheLignes {
  36. my $stars = "*" x 5;
  37. my $regexp = shift;
  38. my @lines = grep /$regexp/, @_;
  39. map {print "$_\n"} @lines;
  40. print "$stars ", scalar(@lines), " lignes trouvees $stars\n";
  41. }
  42. open my $fin, "<", "RegExpTP4_Ex2.txt";
  43. my @lines = <$fin>;
  44. chomp @lines;
  45. close $fin;
  46. open (my $stars, ">>SortieRegExpTP4_Ex2.txt" );
  47. afficheTitre("PERL : Fichier de sortie de l'exercice 2 du TP4" );
  48. foreach (@infos) {
  49. print "\n";
  50. afficheTitre($_->{title});
  51. afficheLignes($_->{regexp}, @lines);


 
J'ai rajouté une ligne pour la vérification du fichier de sortie avec celui de l'entrée. Qu'en pensez vous?


Message édité par laisso le 10-01-2015 à 16:33:16
Reply

Marsh Posté le 10-01-2015 à 17:23:20    

Je pense que ça va pas servir a grand chose, tel que c'est fait la.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed