In Perl vor 5.10 kann man sagen
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";
}
for my $index (0 .. $#a) {
print "At index $index I saw $a[$elem]\n";
}
In Perl 5.10 verwenden Sie state , um eine Variable zu deklarieren, die niemals neu initialisiert wird (im Gegensatz zu denen, die mit my erstellt wurden ). Auf diese Weise können Sie die $index
Variable in einem kleineren Bereich halten, dies kann jedoch zu Fehlern führen (wenn Sie die Schleife ein zweites Mal betreten, hat sie immer noch den letzten Wert):
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
use 5.012;
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 haben Einschränkungen , was Sie tun dürfen, @a
während Sie darüber iterieren each
.
Es wird dir jetzt nicht helfen, aber in Perl 6 kannst du es sagen
my @a = <a b c d e>;
for @a Z 0 .. Inf -> $elem, $index {
say "at index $index, I saw $elem"
}
Der Z
Operator komprimiert die beiden Listen zusammen (dh er nimmt ein Element aus der ersten Liste, dann ein Element aus der zweiten, dann ein Element aus der ersten usw.). Die zweite Liste ist eine faule Liste, die (zumindest theoretisch) jede ganze Zahl von 0 bis unendlich enthält. Das -> $elem, $index
sagt, dass wir zwei Werte gleichzeitig aus dem Ergebnis der Zip nehmen. Der Rest sollte für Sie normal aussehen (es sei denn, Sie sind mit der say
Funktion ab 5.10 noch nicht vertraut ).