81 votes

récupère automatiquement l'index de boucle dans une boucle foreach en perl

Si j'ai le tableau suivant en Perl:

@x = qw(a b c);

et je itérer sur il avec foreach, alors $_ se réfèrent au courant de l'élément dans le tableau:

foreach (@x) {
    print;
}

affichera:

abc

Est-il une manière similaire pour obtenir l' index de l'élément courant, sans mise à jour manuellement un compteur? Quelque chose comme:

foreach (@x) {
    print $index;
}

$index est mis à jour comme d' $_ de rendement de la sortie:

012

120voto

trendels Points 2929

Comme dit Codehead, il vous faudrait parcourir les index du tableau plutôt que ses éléments. Je préfère cette variante au style C pour la boucle:

 for my $i (0 .. $#x) {
    print "$i: $x[$i]\n";
}
 

48voto

Chas. Owens Points 40887

En Perl avant 5.10, vous pouvez dire

#!/usr/bin/perl

use strict;
use warnings;

my @a = qw/a b c d e/;

my $index;
for my $elem (@a) {
    print "At index ", $index++, ", I saw $elem\n";
}

#or

for my $index (0 .. $#a) {
    print "At index $index I saw $a[$elem]\n";
}    

En Perl 5.10, vous utilisez de l'état pour déclarer une variable qui n'est jamais réinitialisé (contrairement à ceux de créer avec mon). Cela vous permet de garder l' $index variable dans une moindre portée, mais peut conduire à des bugs (si vous entrez dans la boucle un deuxième temps, il sera toujours avoir la dernière valeur):

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my @a = qw/a b c d e/;

for my $elem (@a) {
    state $index;
    say "At index ", $index++, ", I saw $elem";
}

En Perl 5.12 vous pouvez dire

#!/usr/bin/perl

use 5.012; #this enables strict
use warnings;

my @a = qw/a b c d e/;

while (my ($index, $elem) = each @a) {
    say "At index $index I saw $elem";
}

Mais attention: vous il y a des restrictions à ce que vous êtes autorisé à faire avec des @a lors de l'itération sur il avec each.

Il ne vous aide pas maintenant, mais en Perl 6, vous serez en mesure de dire

#!/usr/bin/perl6

my @a = <a b c d e>;
for @a Z 0 .. Inf -> $elem, $index {
    say "at index $index, I saw $elem"
}

L' Z opérateur zip les deux listes ensemble (c'est à dire qu'il prend un élément de la première liste, puis un élément à partir de la deuxième, puis un élément à partir de la première, et ainsi de suite). La deuxième liste est un paresseux liste qui contient tous les entiers de 0 à l'infini (au moins théoriquement). L' -> $elem, $index dit que nous sommes de prendre deux valeurs à la fois de la suite de la fermeture éclair. Le reste devrait paraître normal pour vous (sauf si vous n'êtes pas familier avec l' say fonction à partir de 5.10 encore).

21voto

Alan Haggai Alavi Points 34260

perldoc perlvar ne semble pas suggérer une telle variable.

8voto

codehead Points 1696

Pas avec foreach. Si vous avez vraiment besoin de la cardinalité de l'élément dans le tableau, utilisez un itérateur 'pour'.

 for($i=0;$i<@x;++$i) {
  print "Element at index $i is ",$x[$i],"\n";
}
 

4voto

surendra ben Points 41

Oui. J'ai vérifié tellement de livres et d'autres blogs ... En conclusion, il n'y a pas de variable système pour le compteur de boucles. nous devons faire notre propre comptoir. Corrige moi si je me trompe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X