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

时间:2016-12-11 18:02:55

标签: perl hash-of-hashes

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

假设散列具有简单的键/值对并且不是精心设计的记录(包含数组或散列数组),有没有办法找到哈希散列运行的深度?

例如

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

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

我的问题是,是否有任何方法可以测试并找到哈希有两个级别的信息?


从评论

更新

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

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

  2. 该程序还在读取和散列五个级别的其他数据结构,其中包含与第一点中的散列相关的数据。

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

2 个答案:

答案 0 :(得分:3)

假设统一的哈希结构:

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

答案 1 :(得分:2)

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

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