【问题标题】:Getting nth/last value inside a hash of hashes在散列散列中获取第 n 个/最后一个值
【发布时间】:2014-02-20 00:08:43
【问题描述】:

我正在尝试制作一个哈希值来唯一标识仅低于一组级别的数字。哈希结构看起来像这样:

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;
              }
             }
            }
           }
          }
         }    

这个过程似乎运行良好。但我只是在寻找更简单、更短的东西;

提前致谢

【问题讨论】:

  • 您的示例不会达到您的预期。此外,您的上述代码将不起作用,因为您将 hashref 分配给哈希。
  • 你想如何提取值,你对哈希结构提前了解多少?
  • 这个问题只有在每个哈希只有一个键的情况下才有意义,在这种情况下数据结构没有意义。

标签: perl hash hashmap hashtable


【解决方案1】:

这将适用于您的情况(只有哈希,最后是纯标量值)

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

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

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

【讨论】:

    【解决方案2】:

    如果您使用对哈希的引用,这是一种方法:

    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

    【讨论】:

    • 这当然是显而易见的答案。但不知何故,我觉得水平是任意的。否则就太简单了。
    • 正是我遇到的问题
    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 2018-12-07
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2023-03-07
    • 2023-03-22
    相关资源
    最近更新 更多