-2
%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";
         }
   }
4

5 回答 5

3

您既不能访问“第二个键”也不能访问“第二个值”,因为哈希元素没有特定的顺序。print Dumper(\%HoH);可能会给你另一个哈希元素的顺序,而不是你初始化器使用的顺序。如果你想要一个特定的顺序,你应该使用数组的散列。

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

之后,您可以访问 "fred" as$HoH{Group1}->[0]和 "jane" as $HoH{Group2}->[1]

于 2012-09-18T12:47:46.310 回答
1
foreach my $key (keys %HoH)  
{  
    foreach my $value (keys %{$HoH{$key}})  
    {  
        if($value eq "member2") 
        {  
            print $HoH{$key}{$value}."\n";  
        }  
    }
} 
于 2012-09-18T12:35:39.427 回答
1

以下打印每个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";
}
于 2012-09-18T12:37:32.547 回答
1

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

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

还有,$member[$i-1]$hash{'member'.$i}. 除了更快,它只是更好的结构。如果您发现自己使用“索引”键,这很好地表明您想要一个列表而不是哈希。

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

my @groups 
    = ( [ qw<fred   barney> ]
      , [ qw<george jane>   ]
      );
于 2012-09-18T14:02:16.560 回答
0

以另一种方式。

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

print map { "$HoH{$_}{'member2'}\n" } keys %HoH;
于 2012-09-18T12:40:01.287 回答