如何找到嵌套哈希的深度?

How to find the depth of a nested hash of hashes?

我正在尝试编写一个 Perl 子例程来处理任何给定的散列(通过引用传递),但我想让它成为一个通用的,以便我可以在任何地方使用它。

假设散列具有简单的 key/value 对并且不是详细记录(包含数组的数组或散列的数组),是否有任何方法可以找到散列的散列运行的深度?

例如

my %stat = (
    1 => { one => "One is  one.",    two => "two is two"},
    2 => { one => "second val wone", two => "Seconv v"}
);

上面的散列有一级键 1,它有两个键 onetwo。所以它是一个有两个级别的哈希。

我的问题是有没有什么办法可以测试并找到hash有两级的信息?



根据评论更新

关于 “让我相信我需要知道 Perl 散列的嵌套深度”的问题。这是我的情况。

  1. 该程序正在创建一个三层数据结构,并将其发布在一个文本文件中,供处理此已发布数据并执行其他操作的其他脚本使用。

  2. 程序还在读取其他五层数据结构并进行hash,其中有第一点hash相关的数据

  3. 该程序还在处理不断增长的日志文件并收集数据。

遍历哈希值和跟踪级别可以给出答案,

use strict;
use warnings;
use v5.16;

{ my $max;
sub hlevel {
    my ($h, $n) = @_;

    $max = 0 if !$n;
    $max = $n if $max < $n;
    __SUB__->($_, $n +1) for grep {ref eq "HASH"} values %$h;

    return $max;
}}

my %h;
$h{a}{b}{c}{d}{e} =1;
$h{a}{b}{c}{d}{e1}{f} =1;
$h{a}{b}{c}{d}{e1}{f1}{g} =1;
print hlevel(\%h, 0);

输出

6

假设一个统一的散列结构:

use strict;
use warnings;

sub depth {
    my ($h) = @_;
    my $d = 0;
    while () {
        return $d if ref($h) ne 'HASH';
        ($h) = values %$h;
        $d++;
    }
}

my %stat = (
    1 => { one => "One is  one.", two => "two is two"},
    2 => { one => "second val wone", two => "Seconv v"}
);

print depth(\%stat), "\n";

输出:

2