如何从具有未知嵌套级别的嵌套哈希中提取值?

时间:2015-06-24 09:22:49

标签: perl recursion hash

当可能存在未知数量的嵌套级别时,走嵌套哈希结构以获取值的最佳方法是什么?

例如,哈希可以是以下任何一种或任何嵌套级别。

my $hash = { 'known' => { 'a' => { 'b' => 'value' } } };

my $hash = { 'known' => { 'a' => { 'b' =>  { 'c' => 'value' } } } };

my $hash = { 'known' => { 'a' => { 'b' =>  { 'c' => { 'd' => 'value' } } } } };

下面的键a,b,c可以是任何值。

我以为我可以使用递归函数来提取密钥和值以及当前级别,检查该值是否为对 一个哈希,如果这样调用自己,否则我有值?

3 个答案:

答案 0 :(得分:1)

是的,递归有效,

use v5.16;
use warnings;

my $hash = { 'known' => { 'a' => { 'b' => 'value' } } };

print sub { map { ref() ? __SUB__->(values %$_) : $_ } @_ }->($hash);

输出

value

答案 1 :(得分:1)

易于阅读的方法:

#!/usr/bin/env perl
use strict;
use warnings;

my $hash = { 'known' => { 'a' => { 'b' => 'value' } } };
print get_deep_values($hash);

sub get_deep_values {
    my $hash = shift;
    if (ref($hash) eq 'HASH') {
        get_deep_values( (values %$hash)[0] )
    }
    else {
        return $hash;
    }
}

输出:

value

答案 2 :(得分:0)

我假设没有嵌套的哈希值只有一个元素?

一个简单的迭代就是必要的

use strict;
use warnings;
use 5.010;

my @hashes = (
    { 'known' => { 'a' => { 'b' => 'value1' } } },
    { 'known' => { 'a' => { 'b' =>  { 'c' => 'value2' } } } },
    { 'known' => { 'a' => { 'b' =>  { 'c' => { 'd' => 'value3' } } } } },
);

say get_value($_) for @hashes;

sub get_value {
  my ($hash) = @_;
  ($hash) = values %$hash while ref $hash eq 'HASH';
  $hash;
}

输出

value1
value2
value3