缺少$ on循环变量

时间:2010-06-07 09:10:23

标签: perl arrays

#!/usr/bin/perl
use strict;
use warnings;

my @array = qw[a b c];
foreach my($a,$b,$c) (@array) {
    print "$a , $b , $c\n";
}

我收到以下错误:

  

缺少$ on循环变量

有什么问题?

我正在使用:perl v5.10.1 (*) built for x86_64-linux-thread-multi

5 个答案:

答案 0 :(得分:13)

要在每次迭代中获取多个列表项,请使用类似List :: MoreUtils :: natatime的内容 或使用拼接:

my @tmparray = @array; # don't trash original array
while ( my ($a,$b,$c) = splice(@tmparray,0,3) ) {
    print "$a , $b , $c\n";
}

或者将您的数据重组为多个数组,并使用Algorithm :: Loops :: MapCar *函数之一来一次循环多个数组。

答案 1 :(得分:8)

我不知道foreach在Perl中一次可以吃掉多个参数。我可能正在阅读documentation错误。

答案 2 :(得分:5)

正如其他答案中所提到的,Perl并不直接支持迭代for循环中的多个值。这是我在模块List::Gen中解决的问题之一:

use List::Gen;

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

for (every 3 => @array) {
    print "@$_\n";
}

输出:

a b c
d e f

编辑:List::Gen生成的列表切片别名为原始列表,这意味着您可以更改切片中的值以更改原始列表。对于这个问题,发布了其他几个解决方案,似乎无法实现这一功能。

答案 3 :(得分:2)

Block::NamedVar提供了nfor DWIM。这比迭代的替代方法更方便。

use Block::NamedVar;

my @array = qw[a b c];
nfor my($a,$b,$c) (@array) {
    print "$a , $b , $c\n";
}

答案 4 :(得分:1)

我认为你错过了foreach循环的重点。它遍历数组中的每个值。它一次处理一个值。这是正确的代码:

#!/usr/bin/perl
use strict;
use warnings;

my @array = qw[a b c];
foreach my $z (@array) {
    print "$z\n";
}