Simple programme, simple bug

Simple programme, simple bug - Perl - Programmation

Marsh Posté le 11-06-2013 à 20:09:14    

Bonjour,
 
Je suis une ignare totale, merci de votre tolérance.
Mon but est de faire un programme (très basique):
-ouvrir le fichier Bilingual.txt Ce fichier contient une liste de mots français avec leurs traductions en anglais écrit ainsi  
              FRENCH couette
              ENGLISH quilt
              FRENCH oreiller
              ENGLISH pillow, etc.
-ranger les lignes commençant par FRENCH dans le fichier French.txt, et les lignes commençant par ENGLISH dans le fichier English.txt
-numéroter les lignes et afficher le nombre de lignes entrées
 
J'ai fait le code suivant, je pense que le problème doit provenir d'une erreur de chemin:
 
open(MONFICHIER,"/Translated/Bilingual.txt" );
open(MONFICHIER2,">/Translated/French.txt" );
$i=0;
while($ligne =<MONFICHIER> ){
chomp($ligne);
if ($ligne=~/FRENCH/){
$i++;
print  MONFICHIER2 "$i $ligne/n";
}
}
print" le nombre de lignes en français est $i";
open(MONFICHIER3,">/Translated/English.txt" );
$i=0;
while($ligne =<MONFICHIER> ){
chomp($ligne);
if ($ligne=~/FRENCH/){
$i++;
print  MONFICHIER3 "$i $ligne/n";
}
}
print" le nombre de lignes en anglais est $i";
close(MONFICHIER);
close(MONFICHIER2);
close(MONFICHIER3);
 
Je sais que mon code est bien " primaire ", sans doute risible à vos yeux... Mais je serais très reconnaissante si vous pouviez y accorder quelques instants pour repérer la source de mon erreur.
 
Merci par avance  :jap:


Message édité par chimenseena le 11-06-2013 à 20:21:05
Reply

Marsh Posté le 11-06-2013 à 20:09:14   

Reply

Marsh Posté le 11-06-2013 à 20:20:09    

Et une fois que le fichier est ouvert?
A+,


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

Marsh Posté le 11-06-2013 à 20:22:06    

gilou a écrit :

Et une fois que le fichier est ouvert?
A+,


 
Il manquait la fin de mon message !  

Reply

Marsh Posté le 11-06-2013 à 22:10:54    

J'ai pas testé, mais a l'oeil nu, il y a trois erreurs:
 
Erreur pas grave mais qui va tout mettre sur une ligne
print  MONFICHIER2 "$i $ligne/n";  
c'est \n et non pas/n
erreur qui se répète avec MONFICHIER3  
 
Erreur du copier-coller pas relu
open(MONFICHIER3,">/Translated/English.txt" );  
$i=0;  
while($ligne =<MONFICHIER> ){  
chomp($ligne);  
if ($ligne=~/FRENCH/){  
$i++;  
print  MONFICHIER3 "$i $ligne/n";  
}  
}  
c'est if ($ligne=~/ENGLISH/){  
 
Et l'erreur la plus grave:
quand on a lu une première fois MONFICHIER, il faut revenir au début avant de le relire une seconde fois.
print" le nombre de lignes en français est $i";  
open(MONFICHIER3,">/Translated/English.txt" );
ça devrait être
print" le nombre de lignes en français est $i";  
seek(MONFICHIER, 0, SEEK_SET);
open(MONFICHIER3,">/Translated/English.txt" );
 
Et un truc qui n'est pas une erreur, mais sans doute un oubli:
print" le nombre de lignes en français est $i";  
ce serait mieux comme
print" le nombre de lignes en français est $i\n";  
 
A part ça, le reste devrait tenir la route.
 
Une dernière remarque:
faire  
chomp($ligne); ou on vire le \n de la fin
puis
print  MONFICHIER3 "$i $ligne/n";  ou on rajoute le \n supprimé
c'est du boulot inutile
while($ligne =<MONFICHIER> ){  
if ($ligne=~/FRENCH/){  
$i++;  
print  MONFICHIER3 "$i $ligne";  
}  
}  
ça fait la même chose avec une ligne de moins.
 

Citation :

Je sais que mon code est bien " primaire ", sans doute risible à vos yeux...

La philosophie de perl, c'est que l'essentiel, c'est de pouvoir coder quelque chose qui soit une solution a son problème. Il n'y a pas LA solution a un pb en perl, mais tout un tas de solutions, selon son niveau, et qu'aucune n'est "risible", tant qu'elle marche.
 
Bon, j'aurais sans doute écrit ceci ainsi:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. use Fcntl qw(:seek);
  7.  
  8. my ($infile, $outfile, $cnt);
  9. open $infile, "<", '/Translated/Bilingual.txt';
  10.  
  11. $cnt = 0;
  12. open $outfile, ">", '/Translated/French.txt';
  13. while (<$infile> ) {
  14.  print $outfile ++$cnt, " $_" if (/FRENCH/);
  15. }
  16. close $outfile;
  17. print " Le nombre de lignes en français est $cnt\n";
  18.  
  19. seek($infile, 0, SEEK_SET);
  20.  
  21. $cnt = 0;
  22. open $outfile, ">", '/Translated/English.txt';
  23. while (<$infile> ) {
  24.  print $outfile ++$cnt, " $_" if (/ENGLISH/);
  25. }
  26. print " Le nombre de lignes en anglais est $cnt\n";
  27. close $outfile;
  28.  
  29. close $infile;


 
 
A+,


Message édité par gilou le 11-06-2013 à 22:44:45

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

Marsh Posté le 12-06-2013 à 19:13:33    

Merci beaucoup ! C'est bon le programme marche, j'ai effectué les modifications indiquées. Il y avait une autre erreur qui était celui des chemins :
 
open(MONFICHIER,"Bilingual.txt" );
 
et non
 
open(MONFICHIER,"/translated/Bilingual.txt" );
 
Voilà mon code final réussi, et merci encore !
 
# ! /usr/bin/perl -w
open(MONFICHIER,"Bilingual.txt" );  
open(MONFICHIER2,">>French.txt" );  
$i=0;  
while($ligne =<MONFICHIER> ){  
chomp($ligne);  
if ($ligne=~/FRENCH/){  
$i++;  
print  MONFICHIER2 "$i $ligne\n";  
}  
}  
print" le nombre de lignes en français est $i\n";  
seek(MONFICHIER, 0, SEEK_SET);  
open(MONFICHIER3,">>English.txt" );  
$i=0;  
while($ligne =<MONFICHIER> ){  
chomp($ligne);  
if ($ligne=~/ENGLISH/){  
$i++;  
print  MONFICHIER3 "$i $ligne\n";  
}  
}  
print" le nombre de lignes en anglais est $i\n";  
<>;
close(MONFICHIER);  
close(MONFICHIER2);  
close(MONFICHIER3);

Reply

Sujets relatifs:

Leave a Replay

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