我有一个像这样的列表
[[hash,hash,hash],useless,useless,useless]
我想采用哈希的第一个元素并循环遍历它 - 我试试这个:
my @list = get_list_somehow();
print Dumper($list[0][0]); print Dumper($list[0][1]);print Dumper($list[0][2]);
我可以手动访问元素,但是当我尝试这个
时my @list = get_list_somehow()[0];
print Dumper($list[0]); print Dumper($list[1]);print Dumper($list[2]);
foreach(@list){
do_something_with($_);
}
只有$list[0]
返回一个值(第一个哈希,其他一切都是未定义的)
答案 0 :(得分:3)
您正在获取[0]
返回值的下标get_list_somehow()
(虽然从技术上讲,您需要括号)。您需要要做的是取消引用该列表中的第一个元素。所以:
my @list = get_list_somehow();
my $first = $list[0]; # take first element
my @newlist = @$first; # dereference array ref
当然,这很麻烦且冗长,如果你只想用Data::Dumper
打印数组,你可以这样做:
print Dumper $list[0];
或者,如果您只想要第一个数组,则可以一步完成。虽然这看起来很复杂而且很混乱:
my @list = @{ (get_list_somehow())[0] };
@{ ... }
将扩展其中的数组引用,希望从get_list_somehow()
列表的下标返回。
答案 1 :(得分:0)
我认为你的样本数据是这样的:
my @data = [
{
one => 1,
two => 2,
three => 3,
},
"value",
"value",
"value",
];
也就是说,@data
,$data[0]
的第一个元素是你的哈希。这是对的吗?
您的哈希是哈希引用。这是存储该哈希的内存位置的$data[0]
点。
要获取哈希本身,必须取消引用:
my %hash = %{ $data[0] }; # Dereference the hash in $data[0]
for my $key ( keys %hash ) {
say qq( \$hash{$key} = "$hash{$key}".);
}
我本可以一步完成解除引用...
for my $key ( keys @{ $data[0] } ) {
say qq(\$data[0]->{$key} = ") . $data[0]->{$key} . qq(".);
}
请查看Perl Reference Tutorial,了解有关如何使用参考资料的信息。
答案 2 :(得分:0)
我在这里猜测你的数据结构:
my $list = [
[ { a => 1,
b => 2,
c => 3, },
{ d => 4, }
{ e => 5, }
], undef, undef, undef,
];
然后我们得到顶级数组引用的第0个(第一个)元素,它是另一个数组引用,然后是THAT数组引用的第0个(第一个)元素,这是第一个哈希引用:
my $hr = $list->[0][0];
迭代哈希键。这也可以写成一步:keys %{ $list->[0][0] }
。在分为两个步骤时,可以更容易地看到发生了什么。
for my $key (keys %$hr) {
printf "%s => %s\n", $key, $hr->{$key};
}
哪个输出:
c => 3
a => 1
b => 2