Lire un tableau a 2 dim en perl

zouzoulabelle -  
loupius Messages postés 789 Statut Membre -
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. loupius Messages postés 789 Statut Membre 148
     
    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
  2. lami20j
     
    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. loupius Messages postés 789 Statut Membre 148
       
      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
  3. lami20j
     
    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
  4. lami20j
     
    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