In Perl vor 5.10, Sie
#!/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";
}
In Perl 5.10 sagen, Sie state verwenden, um eine Variable zu deklarieren das wird nie neu initialisiert (im Gegensatz zu denen, die mit erstellt werden). Auf diese Weise können Sie die $index
Variable in einem kleineren Umfang zu halten, aber zu Fehlern führen können (wenn Sie die Schleife ein zweites Mal eingeben, wird es immer noch den letzten Wert hat):
#!/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";
}
In Perl 5.12 kann man sagen,
#!/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";
}
Aber seien Sie gewarnt: Sie gibt es restrictions zu dem, was Sie berechtigt sind, mit @a
zu tun, während über ihm mit each
iterieren.
Es wird Sie jetzt nicht helfen, aber in 6 Perl können Sie sagen
#!/usr/bin/perl6
my @a = <a b c d e>;
for @a Z 0 .. Inf -> $elem, $index {
say "at index $index, I saw $elem"
}
Der Z
Betreiber zusammen die beiden Listen Reißverschlüsse (dh es dauert ein Element aus der ersten Liste, dann ein Element von der Sekunde, dann ein Element von der ersten, und so weiter). Die zweite Liste ist eine lazy Liste, die jede ganze Zahl von 0 bis unendlich (zumindest theoretisch) enthält. Die -> $elem, $index
sagt, dass wir aus dem Ergebnis der ZIP zwei Werte auf einmal nehmen. Der Rest sollte normal für Sie aussehen (es sei denn, Sie sind nicht vertraut mit der Funktion von 5.10 noch).
+1 für die Verwendung der hässlichen C-style for-Schleife. – fengshaun
Dies ist nicht was Sie wollen, wenn Array-Index-Sequenz 2, 5, 8, 19 mit Lücken in der Sequenz ist. Ich glaube, dass die Frage etwas bezüglich des Index des aktuellen Elements war. – Andy