循环2d List的第1个元素

时间:2014-03-19 14:32:51

标签: arrays perl list multidimensional-array

我有一个像这样的列表

[[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]返回一个值(第一个哈希,其他一切都是未定义的)

3 个答案:

答案 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