访问 Perl 中哈希哈希的特定密钥


%HoH = (
Group1=> {
    member1=> "fred",
    member2=> "barney",
},
 Group2 => {
    member1   => "george",
    member2   => "jane",  
},
);

如何访问 HoH 的第二个值或第二个键我想访问每个组键的 member2 及其关联值。我不知道我的键名,只知道是第二个键

   foreach $key (keys %HoH){
        foreach $value (keys %{$HoH{$key}}){
            print $key."n";
         }
   }

您既无法访问"第二个键",也不能访问"第二个值",因为哈希元素没有特定的顺序。 print Dumper(%HoH);可能会为您提供比初始值设定项使用的顺序不同的哈希元素顺序。如果你想要一个特定的顺序,你应该使用数组的哈希。

my %HoH = (
    Group1=> [ "fred", "barney" ],
    Group2 => [ "george", "jane" ]
);

之后,您可以访问"弗雷德"作为$HoH{Group1}->[0]和"简"作为$HoH{Group2}->[1]

foreach my $key (keys %HoH)  
{  
    foreach my $value (keys %{$HoH{$key}})  
    {  
        if($value eq "member2") 
        {  
            print $HoH{$key}{$value}."n";  
        }  
    }
} 

下面打印每个member2键的值(另请参阅 perldoc perldsc):

use warnings;
use strict;
my %HoH = (
Group1=> {
    member1=> "fred",
    member2=> "barney",
},
 Group2 => {
    member1   => "george",
    member2   => "jane",  
},
);
for (keys %HoH) {
    print "$HoH{$_}{member2}n";
}

如上所述,您不知道您实际上想要第二个密钥,因为您无法确定哈希密钥的存储顺序。 keys保证为一组一致的键返回相同的顺序,但不太可能按照您声明的顺序返回。

但是,您可以查看有序哈希的Tie::IxHash。但是,如果您真的想在两个哈希之间关联数据,则可能需要重新考虑结构,而不是依赖顺序。

此外,$member[$i-1]$hash{'member'.$i}好。除了速度更快之外,它还具有更好的结构。如果您发现自己使用"索引"键,则表明您想要列表而不是哈希。

从您向我展示的内容来看,这似乎对您的数据结构更有意义:

my @groups 
    = ( [ qw<fred   barney> ]
      , [ qw<george jane>   ]
      );

换句话说。

%HoH = (
Group1=> {
    member1=> "fred",
    member2=> "barney",
},
 Group2 => {
    member1   => "george",
    member2   => "jane",
},
);
print map { "$HoH{$_}{'member2'}n" } keys %HoH;

最新更新