繁体   English   中英

Perl中的双哈希值

[英]Double hash values in Perl

使用哈希时,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很新。

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

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

这或多或少做了同样的事情 - 它会使你的哈希变平 - 从%dh获取values - 这将是一个哈希引用列表 - 然后将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;

所以 - map在这里返回2个值,你可以写成:

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每个哈希引用(因为这是在perl中实现多维数组的方式),然后“解包”它们,返回结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM