2012-09-18 113 views
-2
%HoH = (
Group1=> { 
    member1=> "fred", 
    member2=> "barney", 
}, 
Group2 => { 
    member1 => "george", 
    member2 => "jane", 
}, 

); 

如何才能获得第二值的环比要访问每个组密钥及其关联values.I的member2不知道我的键名第二个关键,我只知道这是第二个关键访问perl中散列哈希散列的特定键?

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

回答

3

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

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

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

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

想我不知道我的键名,我只知道它是引用第二个关键 – shaq

+0

从@toolic开始:“哈希无序,没有第二个”键“。” – memowe

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"; 
} 
+0

假设我不知道我的密钥名,我只知道它是第二个密钥 – shaq

+3

哈希是无序的。没有这样的东西作为“第二”键。 – toolic

+0

除非排序被应用到散列 – Bruce

0

换一种方式。

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

print map { "$HoH{$_}{'member2'}\n" } keys %HoH; 
+0

假设我不知道我的密钥名称,我只知道它是第二个密钥 – shaq

+3

哈希不维护密钥的顺序。换句话说,密钥可能以不同的顺序出现,而不是它的构造方式。也许如果你确定它总是以** 2 **作为后缀。 – tuxuday

1

正如上面提到的,你不知道你真正想要的第二个关键,因为你没有确定散列键被存储在顺序的方法。keys是保证返回相同为了使一致的一组密钥,但不太可能按照您声明的顺序。

但是,您可以查看Tie::IxHash以获得有序散列。但是如果你真的想把两个哈希值之间的数据联系起来,你可能需要重新考虑结构,而不是依赖于顺序。

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

这似乎只是为您的数据的结构更有意义从你向我展示什么:

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