我有一个数组哈希,如下所示:
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
}
}
错误消息 不是[行号]
的ARRAY参考例如,对于第一次迭代,我希望$index
等于Larry
,以便我可以处理它。下一次迭代,我希望$index
等于Curly
,以便我可以处理它。下一次迭代,$index
应该等于Moe
,处理它。下一次迭代,$index
应该等于bb
,依此类推。
可能有比shift
更好的功能。 shift
函数从数组中取出第一个元素。我希望数组的散列保留它的值,这样我就不必重新填充数组的散列。
感谢
答案 0 :(得分:9)
问题是@$value
中的列表已经是数组元素的列表,而不是数组。这就是为什么你不能使用shift
的原因。您所需要的只是:
for my $value (values %hash) {
for my $index (@$value) { # "Larry", "Curly", "Moe" etc
....
#process index
}
}
您可能不希望在阵列上使用shift
,因为这会删除原始结构中的条目。
答案 1 :(得分: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将为特定键一次保存一个数组值。
由于