Lire un tableau a 2 dim en perl

Bonjour,
jé un probleme et j arrive pas a avance dans mon tp
alors voila pour mon tp j utilise un fichier :

un exemple ressemble a mon fichier (1.txt)
region dep com
23 15 16
17 18 19
je veux ecrire un programme qui fe le parcours de tous le fichier et il m affiche tous le contenu du fichier mais un par un .
voici mon programme:
#!/usr/bin/perl
use strict;
open(F, "<1.txt") || die "Erreur E/S : $!\n";
my @contenu = <F>;#jé met le contenu du fichier dans une table a 2 dimension
for $i ( 0 .. 3) {
for $j ( 0 .. 3 ) {
print "element $i $j is $contenu[$i][$j]\n";
}
}
close F;
quand j execute mon programme je recoie le message suivant :
Global symbol "$i" requires explicit package name at exemple.pl line 5.
Global symbol "$j" requires explicit package name at exemple.pl line 6.
Global symbol "$i" requires explicit package name at exemple.pl line 7.
Global symbol "$j" requires explicit package name at exemple.pl line 7.
Global symbol "$i" requires explicit package name at exemple.pl line 7.
Global symbol "$j" requires explicit package name at exemple.pl line 7.
Execution of exemple.pl aborted due to compilation errors.

merci
Configuration: Windows Vista Internet Explorer 7.0

4 réponses

  1. Je crois que l'interpréteur est explicite:
    for $i ( 0 .. 3)
    En Perl, la boucle for a la même structure qu'en C, il vaudrait mieux mettre:
    for ($i=0; $i<4; $i++)
    Ou alors il faut utiliser 'foreach'.
    Bonne continuation.
    0
    1. Salut,

      my @contenu = <F>;#jé met le contenu du fichier dans une table a 2 dimension
      C'est ça que tu crois, mais en réalité tu as un tableau à une seule dimension.
      Ton tableau a la structure suivante :
      @contenu=("region", "dep", "com", "23", "15", "16", "17", "18", "19");


      Un tableau à deux dimensions à la structure suivante
      @TdT=(
             [ "region", "dep", "com" ],
             [ "23", "15", "16" ],
             [ "17", "18", "19" ],
           );


      Tu dois créer le tableau à deux dimensions.
      Voici une manière de le faire
      lami20j@debian-acer:~$ cat 1.txt
      region dep com
      23 15 16
      17 18 19
      lami20j@debian-acer:~$ cat 1.pl
      #!/usr/bin/perl
      use strict;use warnings;
      my $fic="1.txt";
      open F,$fic or die "E/S : $fic $!\n";
      my @tab;
      while(<F>){
          push @tab,[ split ];
      }
      for my $i(0..$#tab){
          for my $j(0..$#{$tab[$i]}){
                print "$tab[$i][$j]\n";
                  }
      }
      __END__
      
      lami20j@debian-acer:~$ perl 1.pl
      region
      dep
      com
      23
      15
      16
      17
      18
      19
      lami20j@debian-acer:~$
      
      


      la boucle for a la même structure qu'en C,
      Oui est non.

      Si on écrit comme ça for ($i=0; $i<4; $i++), tu as raison c'est oui.
      En revanche si on écrit comme ça, for est synonyme de foreach
      lami20j@debian-acer:~$ perl -e 'print "$_\n" for(0..2)'
      0
      1
      2
      lami20j@debian-acer:~$ perl -e 'print "$_\n" foreach(0..2)'
      0
      1
      2
      
      0
      1. Je ne savais pas que le 'for' pouvait servir de 'foreach'; je dois avoir un vieux Perl.
        Merci pour la précision.
        Bonne nuit.
        0
    2. Re,

      je veux ecrire un programme qui fe le parcours de tous le fichier et il m affiche tous le contenu du fichier mais un par un .


      En revanche si ce n'est que l'affichage qui t'interesse alors tu peux faire tout simplement

      lami20j@debian-acer:~$ cat 1.txt
      region dep com
      23 15 16
      17 18 19
      lami20j@debian-acer:~$ cat 2.pl
      #!/usr/bin/perl
      use strict;use warnings;
      my $fic="1.txt";
      open F,$fic or die "E/S : $fic $!\n";
      while(<F>){
          s/\s+/\n/g;
          print;
      }
      __END__
      
      lami20j@debian-acer:~$ perl 2.pl
      region
      dep
      com
      23
      15
      16
      17
      18
      19 
      0
      1. Re,

        Un message de ce genre Global symbol "$i" requires explicit package name at exemple.pl line 5. veut dire que tu aurais du utiliser soit my soit our pour ta variable, à cause de use strict;
        0