Lire un tableau a 2 dim en perl

Fermé
zouzoulabelle - 11 déc. 2009 à 22:17
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 11 déc. 2009 à 23:58
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
A voir également:

4 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
11 déc. 2009 à 22:48
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
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
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
11 déc. 2009 à 23:58
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
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
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