如果我在Perl中有以下数组:
@x = qw(a b c);
我用foreach
遍历它,然后$_
将引用数组中的当前元素:
foreach (@x) {
print;
}
将打印:
abc
有没有类似的方法来获取当前元素的索引,而无需手动更新计数器?像这样的东西:
foreach (@x) {
print $index;
}
其中,像$_
一样更新$index
以生成输出:
012
发布于 2009-06-10 02:42:16
像codehead said一样,您必须遍历数组索引,而不是元素。与C风格的for
循环相比,我更喜欢这个变体:
for my $i (0 .. $#x) {
print "$i: $x[$i]\n";
}
发布于 2009-06-10 06:26:26
在Perl5.10之前的版本中,您可以这样说
#!/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";
}
在Perl5.10中,您可以使用state声明一个永远不会重新初始化的变量(与使用my创建的变量不同)。这使您可以将$index
变量保持在较小的范围内,但它可能会导致错误(如果您第二次进入循环,它仍将具有最后一个值):
#!/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";
}
在Perl5.12中,您可以这样说
#!/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";
}
但需要注意的是:在使用each
迭代@a
时,您可以对它执行restrictions操作。
它现在对您没有帮助,但是在Perl6中,您可以这样说
#!/usr/bin/perl6
my @a = <a b c d e>;
for @a Z 0 .. Inf -> $elem, $index {
say "at index $index, I saw $elem"
}
Z
操作符将两个列表压缩在一起(即,它从第一个列表中获取一个元素,然后从第二个列表中获取一个元素,然后从第一个列表中获取一个元素,依此类推)。第二个列表是一个lazy列表,它包含从0到无穷大(至少在理论上)的每个整数。-> $elem, $index
表示我们一次从压缩结果中获取两个值。其余的对您来说应该是正常的(除非您还不熟悉5.10中的say
函数)。
发布于 2009-06-10 02:00:48
perldoc perlvar
似乎没有提出任何这样的变量。
https://stackoverflow.com/questions/974656
复制相似问题