2014-01-28 43 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);