3

我有一个数组哈希,如下所示:

my %hash = (
234 => ["Larry", "Curly", "Moe"],
235 => ["bb", "ab", "aa", "ab", "bb"],
236 => ["aa", "ab", "bb", "aa", "bb"],
)

对于哈希中的每个键,我想遍历数组的每个元素,将其分配给一个标量变量,以便我可以处理它,然后移动到数组的下一个元素。一旦我为一个键处理了数组的所有元素,我想进入下一个键并单独处理其数组的所有元素,依此类推。

我找到并修改了一个迭代哈希值的代码片段(在这种情况下是每个键的数组)。然后我有一个嵌套的 for 循环,它遍历该数组的每个元素。但是,它并没有像我期望的那样做。

for my $value (values %hash) {
    for (@$value) {
        my $index = shift($_);
       #process index
    }
}

错误消息 Not an ARRAY reference at [line number]

例如,对于第一次迭代,我想$index等于Larry以便我可以处理它。下一次迭代,我想$index相等Curly以便我可以处理它。下一次迭代,$index应该等于Moe,处理它。下一次迭代,$index应该等于bb,依此类推。

可能有比 更好的功能shift。该shift函数从数组中取出第一个元素。我希望数组的散列保留它的值,这样我就不必重新填充数组的散列。

谢谢

4

2 回答 2

9

问题是您的列表@$value已经是您的数组元素列表,而不是数组。这就是为什么你不能使用shift它。所有你需要的是:

for my $value (values %hash) {
    for my $index (@$value) {  # "Larry", "Curly", "Moe" etc
       ....
       #process index
    }
}

无论如何,您可能不想shift在您的数组上使用,因为这会从您的原始结构中删除条目。

于 2013-02-23T17:38:32.247 回答
1

如果你想遍历数组的散列,你可以做这样的事情

#!/usrbin/perl -w
use strict;
use warnings;
use Data::Dumper;


my %hash = (
234 => ["Larry", "Curly", "Moe"],
235 => ["bb", "ab", "aa", "ab", "bb"],
236 => ["aa", "ab", "bb", "aa", "bb"],
);

foreach (keys %hash){
    foreach my $array(@{$hash{$_}}){
        ##do something with $array;
    }
}

这里 $array 将为特定键一次保存一个数组值。

谢谢

于 2016-09-13T04:06:28.323 回答