2014-01-28 141 views
-1

我试图让散列哈希值唯一地标识只在一个集合级别下出现的数字。哈希结构看起来是这样的:获取散列哈希中的第n个值/最后一个值

my %gh = { 
     'Test1' => { 
        'level1a' => { 
          'level2b' => { 
            'level3a' => { 
              'level4a' => { 
                'level5' => '63' 
               } 
             } 
           } 
         } 
       } 
     };   

一些能告诉我什么是遍历散列,所以我可以我一直在使用中获得的价值63

最简单的方法

my $x = ''; 
foreach my $l0 (%gh){ 
      foreach my $l1 (%{$l0}){ 
      foreach my $l2 (%$l1){ 
      foreach my $l3 (%{$l2}){ 
      foreach my $l4 (%$l3){ 
       foreach my $l5 (%{$l4}){ 
       $x = $l5; 
       } 
      } 
      } 
      } 
      } 
     }  

这个过程似乎工作正常。但我只是在寻找更简单和更短的东西;

在此先感谢

+0

您的示例wi你不会做你期望的。此外,你的上面的代码将不起作用,因为你正在为散列分配一个hashref。 – simbabque

+0

你想如何提取价值,你提前知道什么关于哈希结构? –

+0

只有每个散列只有一个键时,这个问题才有意义,在这种情况下,数据结构没有意义。 – ikegami

回答

1

如果使用参考哈希相反,这里是一个办法:

use warnings; 
use strict; 

my $gh = { 
     'Test1' => { 
        'level1a' => { 
          'level2b' => { 
            'level3a' => { 
              'level4a' => { 
                'level5' => '63' 
               } 
             } 
           } 
         } 
       } 
     };   

print $gh->{Test1}{level1a}{level2b}{level3a}{level4a}{level5}, "\n"; 

参见:perldoc perldscData::Diver

+1

这当然是一个明显的答案。但不知何故,我有这样的感觉,即关卡的级别是任意的。否则它会太简单。 – simbabque

+1

究竟是什么即时通讯有麻烦 – user2583714

2

这会在你的情况下工作(只有散列值和最后的纯标量值)

sub hval { 
    my ($h) = @_; 
    return map { ref() ? hval($_) : $_ } values %$h; 
} 

my $gh = { 
     'Test1' => { 
        'level1a' => { 
          'level2b' => { 
            'level3a' => { 
              'level4a' => { 
                'level5' => '63' 
               } 
             } 
           } 
         } 
       } 
};  

my ($x) = hval($gh);