Boucle while dans boucle for

Boucle while dans boucle for - Perl - Programmation

Marsh Posté le 02-09-2012 à 15:39:25    

Bonjour,
 
j'ai un petit souci avec ce script qui doit classer 80 lignes dans l'ordre alphabétique par rapport aux noms des équipes.
 
J'ai un fichier france1_classements.pl que voilà:
 

Spoiler :

1;Marseille ;3;3;0;0;4;0
2;Lyon ;3;2;1;0;6;2
3;Valenciennes ;3;2;1;0;4;0
4;Toulouse ;3;2;1;0;4;2
5;Bordeaux ;3;2;1;0;4;2
6;Bastia ;3;2;0;1;7;6
7;Lorient ;3;1;2;0;6;5
8;Lille ;3;1;2;0;5;4
9;Nancy ;3;1;1;1;2;2
10;St Etienne ;3;1;0;2;6;4
11;Paris SG ;3;0;3;0;2;2
12;Rennes ;3;1;0;2;3;4
13;Reims ;3;1;0;2;2;3
14;Brest ;3;1;0;2;1;5
15;Nice ;3;0;2;1;2;3
16;Ajaccio ;3;1;1;1;1;3
17;Evian TG ;3;0;1;2;3;5
18;Montpellier ;3;0;1;2;2;4
19;Troyes ;3;0;1;2;3;7
20;Sochaux ;3;0;0;3;2;6
1;Valenciennes ;2;1;1;0;3;0
2;St Etienne ;2;1;0;1;5;2
3;Lyon ;1;1;0;0;4;1
4;Marseille ;1;1;0;0;2;0
5;Lorient ;1;1;0;0;2;1
6;Bastia ;1;1;0;0;2;1
7;Toulouse ;1;1;0;0;2;1
8;Brest ;1;1;0;0;1;0
9;Bordeaux ;1;1;0;0;1;0
10;Rennes ;2;1;0;1;3;3
11;Nancy ;2;1;0;1;1;1
12;Reims ;2;1;0;1;1;1
13;Paris SG ;2;0;2;0;2;2
14;Lille ;1;0;1;0;1;1
15;Ajaccio ;1;0;1;0;0;0
16;Evian TG ;2;0;1;1;3;4
17;Nice ;2;0;1;1;2;3
18;Troyes ;2;0;1;1;2;3
19;Montpellier ;2;0;1;1;1;2
20;Sochaux ;1;0;0;1;2;3
1;Marseille ;2;2;0;0;2;0
2;Lille ;2;1;1;0;4;3
3;Bordeaux ;2;1;1;0;3;2
4;Toulouse ;2;1;1;0;2;1
5;Lyon ;2;1;1;0;2;1
6;Valenciennes ;1;1;0;0;1;0
7;Bastia ;2;1;0;1;5;5
8;Ajaccio ;2;1;0;1;1;3
9;Lorient ;2;0;2;0;4;4
10;Nancy ;1;0;1;0;1;1
11;Nice ;1;0;1;0;0;0
12;Paris SG ;1;0;1;0;0;0
13;St Etienne ;1;0;0;1;1;2
14;Montpellier ;1;0;0;1;1;2
15;Reims ;1;0;0;1;1;2
16;Evian TG ;1;0;0;1;0;1
17;Rennes ;1;0;0;1;0;1
18;Troyes ;1;0;0;1;1;4
19;Sochaux ;2;0;0;2;0;3
20;Brest ;2;0;0;2;0;5
1;Marseille ;3;3;0;0;4;0
2;Lyon ;3;2;1;0;6;2
3;Valenciennes ;3;2;1;0;4;0
4;Toulouse ;3;2;1;0;4;2
5;Bordeaux ;3;2;1;0;4;2
6;Bastia ;3;2;0;1;7;6
7;Lorient ;3;1;2;0;6;5
8;Lille ;3;1;2;0;5;4
9;Nancy ;3;1;1;1;2;2
10;Ajaccio ;3;1;1;1;1;3
11;St Etienne ;3;1;0;2;6;4
12;Paris SG ;3;0;3;0;2;2
13;Rennes ;3;1;0;2;3;4
14;Reims ;3;1;0;2;2;3
15;Brest ;3;1;0;2;1;5
16;Nice ;3;0;2;1;2;3
17;Evian TG ;3;0;1;2;3;5
18;Montpellier ;3;0;1;2;2;4
19;Troyes ;3;0;1;2;3;7
20;Sochaux ;3;0;0;3;2;6
 
Nombre de lignes: 80
 
Nombre d'equipes: 20


 
et je veux classer ces lignes comme ceci (Equipes dans l'ordre alphabétique et dans l'ordre où elles se présentent dans le fichier):

Spoiler :


16;Ajaccio ;3;1;1;1;1;3
15;Ajaccio ;1;0;1;0;0;0
8;Ajaccio ;2;1;0;1;1;3
10;Ajaccio ;3;1;1;1;1;3
6;Bastia ;3;2;0;1;7;6
6;Bastia ;1;1;0;0;2;1
7;Bastia ;2;1;0;1;5;5
6;Bastia ;3;2;0;1;7;6
5;Bordeaux ;3;2;1;0;4;2
9;Bordeaux ;1;1;0;0;1;0
3;Bordeaux ;2;1;1;0;3;2
5;Bordeaux ;3;2;1;0;4;2
14;Brest ;3;1;0;2;1;5
8;Brest ;1;1;0;0;1;0
20;Brest ;2;0;0;2;0;5
15;Brest ;3;1;0;2;1;5
...
...
...
...
19;Troyes ;3;0;1;2;3;7
18;Troyes ;2;0;1;1;2;3
18;Troyes ;1;0;0;1;1;4
19;Troyes ;3;0;1;2;3;7
3;Valenciennes ;3;2;1;0;4;0
1;Valenciennes ;2;1;1;0;3;0
6;Valenciennes ;1;1;0;0;1;0
3;Valenciennes ;3;2;1;0;4;0


 
 
Voici ce que j'ai fait (La partie de code qui ne fonctionne pas correctement est à partir de la ligne 63 où j'utilise le tableau @OA dans lequel je récupère uniquement les noms des équipes dans l'ordre alphabétique). Quand je le fait fonctionner j'ai un warning "Use of uninitialized value within @OA1 in concatenation (.) or string at ordre_alphabetique.pl line 75, <A3> line 84" et dans mon fichier ordre_alphabetique1.txt j'obtiens uniquement les 4 premières lignes de l'équipe d'Ajaccio et c'est tout !
Je me demande si on a le droit de faire une boucle while de lecture de fichier dans une boucle for ? J'ai l'impression que ma boucle s'arrête et ne relis pas le fichier france1_classements.txt pour $l=1. Qu'est-ce que je fais faux dans cette boucle ? Une idée? Merci.
 
 

Code :
  1. #!C:/Perl/bin/perl.exe -w
  2. use strict;
  3. use warnings;
  4. use HTML::TreeBuilder;
  5. use LWP::Simple;
  6. my ($j, $i, $k, $l, $m, $ligne, $ligne1, $x, $y);
  7. my (@OA1) = ();
  8. # Je récupère le nombre d'équipes du championnat dans $nb_eq
  9. open(FR1A,'france1.txt');
  10. while(my $ligne = <FR1A> ) {
  11. $j++;
  12.    }
  13.  
  14. my $nb_eq = ($j-4)/4;
  15. close FR1A;
  16. #J'ouvre les deux fichiers concernés par le classement alphabetique
  17. open(A1,"france1_classements.txt" );
  18. open(A2,">ordre_alphabetique.txt" );
  19. # Je crée un tableau multidimensionnel @TdT qui contient tous les champs du fichier france1_classements.txt
  20. my(@TdT, @tmp);
  21. while($ligne = <A1> ) {
  22. @tmp = split(/;/,$ligne);
  23. push @TdT, [ @tmp];
  24.   }
  25. # Je récupère dans @TdT uniquement les noms des équipes grace à la Regexp /(\w+\s)+/
  26. my @part = grep(/(\w+\s)+/,@TdT);
  27. # Boucle for pour remplir le tableau @part des $nb_eq équipes du championnat
  28. for ($i=0; $i<=$nb_eq-1;$i++) {
  29.  push @part, $TdT[$i][1];
  30. }
  31. # Je classe par ordre lexical(alphabetique) les valeurs du tableau @part dans le tableau @OA
  32. my @OA = sort @part;
  33. #J'affiche dans le fichier ordre_alphabetique.txt les equipes dans l'ordre alphabetique
  34. for $i (0..($nb_eq-1)) {
  35. print A2 $OA[$i]."\n";
  36. }
  37. #Calcul du nombre de buts marqués total par toutes les équipes
  38. my $goals_for = 0;
  39. for($k=0; $k<=($nb_eq-1); $k++) {
  40. $goals_for += $TdT[$k][6];
  41. }
  42. #Calcul du nombre de buts encaissés total par toutes les équipes
  43. my $goals_against = 0;
  44. for($k=0; $k<=($nb_eq-1); $k++) {
  45. $goals_against += $TdT[$k][7];
  46. }
  47. print A2 "Nombre de buts marques:".$goals_for."\n";
  48. print A2 "Nombre de buts encaisses:".$goals_against;
  49. close A2;
  50. open(A3,"france1_classements.txt" );
  51. open(A4,">ordre_alphabetique1.txt" );
  52. for ($l=0; $l<=($nb_eq-1); $l++) {
  53. while ($ligne1 = <A3> ) {
  54. if( $ligne1 =~ /$OA[$l]/){
  55.  push @OA1, $ligne1;
  56. }
  57. }
  58. }
  59. for ($m=0; $m<=4*$nb_eq; $m++) {
  60. print A4 $OA1[$m]."\n";
  61. }
  62. close A3;
  63. close A4;
  64. close A1;


Message édité par thales69 le 02-09-2012 à 15:41:35
Reply

Marsh Posté le 02-09-2012 à 15:39:25   

Reply

Marsh Posté le 02-09-2012 à 16:29:08    

Bon ben pour une fois je viens de trouver une solution en utilisant la fonction seek(A3, 0, 0) qui remet le curseur au début du fichier. Par contre j'ai toujours un warning "Use of uninitialized value in print at ordre_alphabetique.pl line 76, <A3> line 1680." ? En tous cas ça me sort bien le fichier que je voulais :)
 

Code :
  1. for ($l=0; $l<=($nb_eq-1); $l++) {
  2. while ($ligne1 = <A3> ) {
  3. if( $ligne1 =~ /$OA[$l]/){
  4.  push @OA1, $ligne1;
  5. }
  6. }
  7. seek(A3, 0, 0);
  8. }


Message édité par thales69 le 02-09-2012 à 16:31:10
Reply

Marsh Posté le 02-09-2012 à 16:39:03    

Citation :

et je veux classer ces lignes comme ceci (Equipes dans l'ordre alphabétique et dans l'ordre où elles se présentent dans le fichier):

 
C'est très simple:

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. open(my $IN, 'teams.txt');
  6. my @out = map $_->[0], sort { $a->[2] cmp $b->[2] } map [$_, split /;/], <$IN>;
  7. close($IN);
  8.  
  9. print " @out";


 
En entrée: teams.txt
 

1;Marseille ;3;3;0;0;4;0  
2;Lyon ;3;2;1;0;6;2  
3;Valenciennes ;3;2;1;0;4;0  
4;Toulouse ;3;2;1;0;4;2  
5;Bordeaux ;3;2;1;0;4;2  
6;Bastia ;3;2;0;1;7;6  
7;Lorient ;3;1;2;0;6;5  
8;Lille ;3;1;2;0;5;4  
9;Nancy ;3;1;1;1;2;2  
10;St Etienne ;3;1;0;2;6;4  
11;Paris SG ;3;0;3;0;2;2  
12;Rennes ;3;1;0;2;3;4  
13;Reims ;3;1;0;2;2;3  
14;Brest ;3;1;0;2;1;5  
15;Nice ;3;0;2;1;2;3  
16;Ajaccio ;3;1;1;1;1;3  
17;Evian TG ;3;0;1;2;3;5  
18;Montpellier ;3;0;1;2;2;4  
19;Troyes ;3;0;1;2;3;7  
20;Sochaux ;3;0;0;3;2;6  
1;Valenciennes ;2;1;1;0;3;0  
2;St Etienne ;2;1;0;1;5;2  
3;Lyon ;1;1;0;0;4;1  
4;Marseille ;1;1;0;0;2;0  
5;Lorient ;1;1;0;0;2;1  
6;Bastia ;1;1;0;0;2;1  
7;Toulouse ;1;1;0;0;2;1  
8;Brest ;1;1;0;0;1;0  
9;Bordeaux ;1;1;0;0;1;0  
10;Rennes ;2;1;0;1;3;3  
11;Nancy ;2;1;0;1;1;1  
12;Reims ;2;1;0;1;1;1  
13;Paris SG ;2;0;2;0;2;2  
14;Lille ;1;0;1;0;1;1  
15;Ajaccio ;1;0;1;0;0;0  
16;Evian TG ;2;0;1;1;3;4  
17;Nice ;2;0;1;1;2;3  
18;Troyes ;2;0;1;1;2;3  
19;Montpellier ;2;0;1;1;1;2  
20;Sochaux ;1;0;0;1;2;3  
1;Marseille ;2;2;0;0;2;0  
2;Lille ;2;1;1;0;4;3  
3;Bordeaux ;2;1;1;0;3;2  
4;Toulouse ;2;1;1;0;2;1  
5;Lyon ;2;1;1;0;2;1  
6;Valenciennes ;1;1;0;0;1;0  
7;Bastia ;2;1;0;1;5;5  
8;Ajaccio ;2;1;0;1;1;3  
9;Lorient ;2;0;2;0;4;4  
10;Nancy ;1;0;1;0;1;1  
11;Nice ;1;0;1;0;0;0  
12;Paris SG ;1;0;1;0;0;0  
13;St Etienne ;1;0;0;1;1;2  
14;Montpellier ;1;0;0;1;1;2  
15;Reims ;1;0;0;1;1;2  
16;Evian TG ;1;0;0;1;0;1  
17;Rennes ;1;0;0;1;0;1  
18;Troyes ;1;0;0;1;1;4  
19;Sochaux ;2;0;0;2;0;3  
20;Brest ;2;0;0;2;0;5  
1;Marseille ;3;3;0;0;4;0  
2;Lyon ;3;2;1;0;6;2  
3;Valenciennes ;3;2;1;0;4;0  
4;Toulouse ;3;2;1;0;4;2  
5;Bordeaux ;3;2;1;0;4;2  
6;Bastia ;3;2;0;1;7;6  
7;Lorient ;3;1;2;0;6;5  
8;Lille ;3;1;2;0;5;4  
9;Nancy ;3;1;1;1;2;2  
10;Ajaccio ;3;1;1;1;1;3  
11;St Etienne ;3;1;0;2;6;4  
12;Paris SG ;3;0;3;0;2;2  
13;Rennes ;3;1;0;2;3;4  
14;Reims ;3;1;0;2;2;3  
15;Brest ;3;1;0;2;1;5  
16;Nice ;3;0;2;1;2;3  
17;Evian TG ;3;0;1;2;3;5  
18;Montpellier ;3;0;1;2;2;4  
19;Troyes ;3;0;1;2;3;7  
20;Sochaux ;3;0;0;3;2;6  


 
et en sortie:
 

C:\Perl>perl sortit.pl
 16;Ajaccio ;3;1;1;1;1;3
 15;Ajaccio ;1;0;1;0;0;0
 8;Ajaccio ;2;1;0;1;1;3
 10;Ajaccio ;3;1;1;1;1;3
 6;Bastia ;3;2;0;1;7;6
 6;Bastia ;1;1;0;0;2;1
 7;Bastia ;2;1;0;1;5;5
 6;Bastia ;3;2;0;1;7;6
 5;Bordeaux ;3;2;1;0;4;2
 9;Bordeaux ;1;1;0;0;1;0
 3;Bordeaux ;2;1;1;0;3;2
 5;Bordeaux ;3;2;1;0;4;2
 14;Brest ;3;1;0;2;1;5
 8;Brest ;1;1;0;0;1;0
 20;Brest ;2;0;0;2;0;5
 15;Brest ;3;1;0;2;1;5
 17;Evian TG ;3;0;1;2;3;5
 16;Evian TG ;2;0;1;1;3;4
 16;Evian TG ;1;0;0;1;0;1
 17;Evian TG ;3;0;1;2;3;5
 8;Lille ;3;1;2;0;5;4
 14;Lille ;1;0;1;0;1;1
 2;Lille ;2;1;1;0;4;3
 8;Lille ;3;1;2;0;5;4
 7;Lorient ;3;1;2;0;6;5
 5;Lorient ;1;1;0;0;2;1
 9;Lorient ;2;0;2;0;4;4
 7;Lorient ;3;1;2;0;6;5
 2;Lyon ;3;2;1;0;6;2
 3;Lyon ;1;1;0;0;4;1
 5;Lyon ;2;1;1;0;2;1
 2;Lyon ;3;2;1;0;6;2
 1;Marseille ;3;3;0;0;4;0
 4;Marseille ;1;1;0;0;2;0
 1;Marseille ;2;2;0;0;2;0
 1;Marseille ;3;3;0;0;4;0
 18;Montpellier ;3;0;1;2;2;4
 19;Montpellier ;2;0;1;1;1;2
 14;Montpellier ;1;0;0;1;1;2
 18;Montpellier ;3;0;1;2;2;4
 9;Nancy ;3;1;1;1;2;2
 11;Nancy ;2;1;0;1;1;1
 10;Nancy ;1;0;1;0;1;1
 9;Nancy ;3;1;1;1;2;2
 15;Nice ;3;0;2;1;2;3
 17;Nice ;2;0;1;1;2;3
 11;Nice ;1;0;1;0;0;0
 16;Nice ;3;0;2;1;2;3
 11;Paris SG ;3;0;3;0;2;2
 13;Paris SG ;2;0;2;0;2;2
 12;Paris SG ;1;0;1;0;0;0
 12;Paris SG ;3;0;3;0;2;2
 13;Reims ;3;1;0;2;2;3
 12;Reims ;2;1;0;1;1;1
 15;Reims ;1;0;0;1;1;2
 14;Reims ;3;1;0;2;2;3
 12;Rennes ;3;1;0;2;3;4
 10;Rennes ;2;1;0;1;3;3
 17;Rennes ;1;0;0;1;0;1
 13;Rennes ;3;1;0;2;3;4
 20;Sochaux ;3;0;0;3;2;6
 20;Sochaux ;1;0;0;1;2;3
 19;Sochaux ;2;0;0;2;0;3
 20;Sochaux ;3;0;0;3;2;6
 10;St Etienne ;3;1;0;2;6;4
 2;St Etienne ;2;1;0;1;5;2
 13;St Etienne ;1;0;0;1;1;2
 11;St Etienne ;3;1;0;2;6;4
 4;Toulouse ;3;2;1;0;4;2
 7;Toulouse ;1;1;0;0;2;1
 4;Toulouse ;2;1;1;0;2;1
 4;Toulouse ;3;2;1;0;4;2
 19;Troyes ;3;0;1;2;3;7
 18;Troyes ;2;0;1;1;2;3
 18;Troyes ;1;0;0;1;1;4
 19;Troyes ;3;0;1;2;3;7
 3;Valenciennes ;3;2;1;0;4;0
 1;Valenciennes ;2;1;1;0;3;0
 6;Valenciennes ;1;1;0;0;1;0
 3;Valenciennes ;3;2;1;0;4;0
 


 
C'est juste une application de la technique indiquée dans mon troisième post du topic trucs et astuces en perl.
 
EDIT: version amélioirée qui traite un peux mieux les "\n" de fin de ligne:

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. open(my $IN, 'teams.txt');
  6. my @out = map $_->[0], sort { $a->[2] cmp $b->[2] } map {chomp; [$_, split /;/]} <$IN>;
  7. close($IN);
  8.  
  9. print join("\n", @out);


 
A+,


Message édité par gilou le 02-09-2012 à 16:55:38

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

Marsh Posté le 02-09-2012 à 18:58:07    

Merci Gilou, effectivement en 4 lignes tu fais ce que j'ai fais en 30 lignes,  pour de l'optimisation c'est de l'optimisation !! Mais bon même si je code bourrin je progresse quand même.
En tous cas je vais pas me priver de prendre ces 4 lignes à la place des miennes :)
 
A+

Reply

Marsh Posté le 02-09-2012 à 21:00:05    

Faut pas t'inquiéter, on a tous commencé à faire comme tu fais, jusqu'au jour ou on est tombé sur un exemple de cette technique.
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