首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Perl中自动获取foreach循环中的循环索引

在Perl中自动获取foreach循环中的循环索引
EN

Stack Overflow用户
提问于 2009-06-10 01:56:30
回答 11查看 121.1K关注 0票数 76

如果我在Perl中有以下数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@x = qw(a b c);

我用foreach遍历它,然后$_将引用数组中的当前元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach (@x) {
    print;
}

将打印:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abc

有没有类似的方法来获取当前元素的索引,而无需手动更新计数器?像这样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach (@x) {
    print $index;
}

其中,像$_一样更新$index以生成输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
012
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-06-10 02:42:16

codehead said一样,您必须遍历数组索引,而不是元素。与C风格的for循环相比,我更喜欢这个变体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for my $i (0 .. $#x) {
    print "$i: $x[$i]\n";
}
票数 114
EN

Stack Overflow用户

发布于 2009-06-10 06:26:26

在Perl5.10之前的版本中,您可以这样说

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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变量保持在较小的范围内,但它可能会导致错误(如果您第二次进入循环,它仍将具有最后一个值):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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中,您可以这样说

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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中,您可以这样说

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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函数)。

票数 47
EN

Stack Overflow用户

发布于 2009-06-10 02:00:48

perldoc perlvar似乎没有提出任何这样的变量。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/974656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文