Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Parcours d'un tableau de tableaux

7 réponses
Avatar
CB
Bonjour,
J'ai une référence sur un tableau de tableaux, et j'aimerais parcourir
ce tableau.
Avec ceci :

foreach my $i ( @{$array_ref} ) {
print "$array_ref->[$i] -- $array_ref->[$i]->[0] \n";
}

la boucle tourne à l'infini.

Alors qu'avec :

for my $i ( 0 .. $#{$array_ref} ) {

Cela fonctionne bien.

Je croyais pourtant for et foreach équivalentes.

Mais c'est vrai que perlol utilise toujours for, tandis que perldsc
réserve foreach aux parcours de hachages.

Pouvez-vous m'expliquer un peu la différence entre les deux constructions ?
Merci.

7 réponses

Avatar
Laurent Wacrenier
CB écrit:
J'ai une référence sur un tableau de tableaux, et j'aimerais parcourir
ce tableau.
Avec ceci :

foreach my $i ( @{$array_ref} ) {
print "$array_ref->[$i] -- $array_ref->[$i]->[0] n";
}


C'est pas plutôt comme ça :

foreach my $i (@$array_ref) {
print "$i -- $i->[0]n";
}

Avatar
CB
Laurent Wacrenier wrote:
CB écrit:

J'ai une référence sur un tableau de tableaux, et j'aimerais parcourir
ce tableau.
Avec ceci :

foreach my $i ( @{$array_ref} ) {
print "$array_ref->[$i] -- $array_ref->[$i]->[0] n";
}



C'est pas plutôt comme ça :

foreach my $i (@$array_ref) {
print "$i -- $i->[0]n";
}

Ca n'arrange pas mes affaires.

Je pense que ce que tu proposes est un "sucre" de syntaxe.
Extrait du perlreftut :
"Dans la RÈGLE D'UTILISATION 1, vous pouvez omettre les accolades quand
ce qui est à l'intérieur est une variable scalaire atomique comme $tref.
Par exemple, @$tref est identique à @{$tref}, et $$tref[1] est identique
à ${$tref}[1]. Si vous ne faites que..."
Merci.


Avatar
Jacques Caron
On Thu, 28 Jul 2005 17:33:59 +0200, CB wrote:

Laurent Wacrenier wrote:
CB écrit:

J'ai une référence sur un tableau de tableaux, et j'aimerais parcourir
ce tableau.
Avec ceci :

foreach my $i ( @{$array_ref} ) {
print "$array_ref->[$i] -- $array_ref->[$i]->[0] n";
}
C'est pas plutôt comme ça :

foreach my $i (@$array_ref) {
print "$i -- $i->[0]n";
}

Ca n'arrange pas mes affaires.

Je pense que ce que tu proposes est un "sucre" de syntaxe.
Extrait du perlreftut :
"Dans la RÈGLE D'UTILISATION 1, vous pouvez omettre les accolades quand
ce qui est à l'intérieur est une variable scalaire atomique comme $tref.
Par exemple, @$tref est identique à @{$tref}, et $$tref[1] est identique
à ${$tref}[1]. Si vous ne faites que..."


Tu as raté la partie importante... Si tu parcours @$array_ref, tu obtiens
le contenu de chaque "case", pas son index, donc s'il s'agit d'un tableau
de tableaux, tu accèdes à ses valeurs par $i->[index] et pas
$array_ref->[$i]->[index].

Jacques.



Avatar
Laurent Wacrenier
CB écrit:
J'ai une référence sur un tableau de tableaux, et j'aimerais parcourir
ce tableau.
Avec ceci :

foreach my $i ( @{$array_ref} ) {
print "$array_ref->[$i] -- $array_ref->[$i]->[0] n";
}



C'est pas plutôt comme ça :

foreach my $i (@$array_ref) {
print "$i -- $i->[0]n";
}

Ca n'arrange pas mes affaires.

Je pense que ce que tu proposes est un "sucre" de syntaxe.


Non. @$array_ref liste les valeurs et non les indices.
Là tu affiches les valeurs dont les incides sont les valeurs, ce qui
n'a pas de sens à priori.



Avatar
CB
Laurent Wacrenier wrote:
CB écrit:

J'ai une référence sur un tableau de tableaux, et j'aimerais parcourir
ce tableau.
Avec ceci :

foreach my $i ( @{$array_ref} ) {
print "$array_ref->[$i] -- $array_ref->[$i]->[0] n";
}



C'est pas plutôt comme ça :

foreach my $i (@$array_ref) {
print "$i -- $i->[0]n";
}



Ca n'arrange pas mes affaires.
Je pense que ce que tu proposes est un "sucre" de syntaxe.



Non. @$array_ref liste les valeurs et non les indices.
Là tu affiches les valeurs dont les incides sont les valeurs, ce qui
n'a pas de sens à priori.


Ca marche maintenant.
J'avais effectivement loupé l'erreur dans mon ordre print que tu as
corrigé dans ta première réponse.
Merci à toi ainsi qu'à Jacques C.




Avatar
Klaus Eichner
"CB" wrote in message
news:42e8ec47$0$25016$
Bonjour,


[...]

Je croyais pourtant for et foreach équivalentes.


C'est absolument correcte
Voir http://perl.enstimac.fr/DocFr/perlsyn.html#boucles%20foreach
"...Le mot-clé foreach est en fait un synonyme du mot-clé for..."

Mais c'est vrai que perlol utilise toujours for, tandis que perldsc
réserve foreach aux parcours de hachages.
Pouvez-vous m'expliquer un peu la différence entre les deux constructions
?


Les 2 constructions sont parfaitement échangable, c'est-à-dire dans un
programme Perl on peut toujours remplacer "for" par "foreach" ou "foreach"
par "for", ça ne change strictement rien dans l'execution du programme.

Il y a 2 styles pour la construction d'une boucle "for" / "foreach".

1.) le style "proprement Perl" avec for/foreach (@Array) { ... }
2.) l'ancien style "C/C++" avec for/foreach (INIT; CONDITION; MOD) { ... }

Par exemple, les 2 contructions du style "proprement Perl" sont parfaitement
identiques:

- foreach (@ary) { s/foo/bar/ }
- for (@ary) { s/foo/bar/ }

Egalement, les 2 contructions de l'ancien style "C/C++" sont parfaitement
identiques:

- foreach (my $i = 0; $i < @ary; $i++) { $ary[$i] =~ s/foo/bar/ }
- for (my $i = 0; $i < @ary; $i++) { $ary[$i] =~ s/foo/bar/ }

=================== Mais il y a une différence au niveau de l'execution entre le style
"proprement Perl" et l'ancien style "C/C++":

La boucle du style "proprement Perl":
for/foreach (@ary) { s/foo/bar/ }

est plus rapide que la boucle de l'ancien style "C/C++":
for/foreach (my $i = 0; $i < @ary; $i++) { $ary[$i] =~ s/foo/bar/ }

à cause des éléments individuels "$ary[$i]" qui sont référencé explicitement
dans la boucle de l'ancien style "C/C++".

--
Klaus

Avatar
Laurent Wacrenier
Klaus Eichner écrit:
La boucle du style "proprement Perl":
for/foreach (@ary) { s/foo/bar/ }

est plus rapide que la boucle de l'ancien style "C/C++":
for/foreach (my $i = 0; $i < @ary; $i++) { $ary[$i] =~ s/foo/bar/ }


Ce n'est pas plus rapide avec une grosse table.