Perl中的双哈希值

时间:2016-05-23 09:32:40

标签: perl hash

使用哈希时,Perl有一个非常方便的values关键字来处理哈希值。

假设我有一个双哈希,即像这样创建的东西:

my %dh = map { {$_->{id1}}{$_->{id2}} => $_ } @arr;

然后values %dh返回一个哈希数组。要访问这些值,我需要这样的东西:

for my $key1 (keys %dh) {
    for my $val (values %{ $dh{$key1} }) {
        # stuff...
    }
}

有没有更好的方法来做到这一点,避免for个周期?像values %{ values %dh }这样的东西。

另外,抱歉语法不好,我对Perl很新。

1 个答案:

答案 0 :(得分:5)

您可以再次使用map来提取它。不要有任何幻想 - 它仍然在循环。它可能更优雅:

for my $val ( map { values %$_ } values %dh ) {
    #do stuff
}

这或多或少做同样的事情 - 它会使你的哈希变平 - 从values获取%dh - 这将是一个哈希引用列表 - 然后拉动{{1那些。 (我认为应该这样做,但没有测试数据,我无法确定)。

注意 - 来自values的退货订单未定义,因此您将以随机顺序获取它们。如果您愿意,可以通过values(以及keys)控制订购。

sort所做的只是评估代码块,并将结果作为列表返回。这就是为什么map有效 - 它实际上返回了一对值,当你将它分配给哈希时,被视为键值对。

map { $_ => 1 } qw ( one two three )

所以 - use Data::Dumper; my @stuff = map { $_ => 1 } qw ( one two three ); print Dumper \@stuff; my %hash = map { $_ => 1 } qw ( one two three ); print Dumper \%hash; 在这里返回2个值,您可以写为:

map

因为当然,my @stuff = map { $_, 1 } qw ( one two three ); 实际上只是一个逗号(在引用方面有一些额外的功能)。

因此,在对数组进行解引用时,您也可以这样做 - =>返回values中每个元素的值列表。

为了清楚起见:

map

基本上做同样的事情 - 遍历use Data::Dumper; my @stuff = ( [ 1, 2, 3 ], [4, 5, 6], [7, 8, 9] ); print Dumper \@stuff; my @newstuff = map { @$_ } @stuff; print Dumper \@newstuff; 中的每个哈希引用(因为这是多维数组在@stuff中实现的方式),然后'解包'它们,返回结果。