当可能存在未知数量的嵌套级别时,走嵌套哈希结构以获取值的最佳方法是什么?
例如,哈希可以是以下任何一种或任何嵌套级别。
my $hash = { 'known' => { 'a' => { 'b' => 'value' } } };
my $hash = { 'known' => { 'a' => { 'b' => { 'c' => 'value' } } } };
my $hash = { 'known' => { 'a' => { 'b' => { 'c' => { 'd' => 'value' } } } } };
下面的键a,b,c可以是任何值。
我以为我可以使用递归函数来提取密钥和值以及当前级别,检查该值是否为对 一个哈希,如果这样调用自己,否则我有值?
答案 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