2014-03-19 55 views
0

的第1个要素我有这样循环2D名单

[[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]返回一个值(第一散列,everythi ng else is undefined)

+3

你能告诉您的实际数据,而不是占位符? –

回答

3

您正在取012,的返回值的下标[0](尽管从技术上讲,您需要括号)。你需要需要做的是取消引用该列表中的第一个元素。所以:

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()列表中的下标返回。

+0

谢谢:我用过这个 - 我的@list = @ {(get_list_somehow())[0]}; 作品 – Kevin

+0

不客气。 – TLP

0

我要带你的样本数据是这样的:

my @data = [ 
       { 
        one => 1, 
        two => 2, 
        three => 3, 
       }, 
       "value", 
       "value", 
       "value", 
      ]; 

也就是说,@data的第一要素,$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为有关如何使用参考的信息。

0

我在这里猜测你的数据结构的位:

my $list = [ 
    [ { a => 1, 
     b => 2, 
     c => 3, }, 
    { d => 4, } 
    { e => 5, } 
    ], undef, undef, undef, 
]; 

然后我们得到的第0顶级数组引用,这是另一个数组引用的(第一个)元素,然后在第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