【问题标题】:How to find the depth of a nested hash of hashes?如何找到哈希嵌套哈希的深度?
【发布时间】:2016-12-11 18:02:54
【问题描述】:

我正在尝试编写一个 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. 该程序还在处理不断增长的日志文件并收集数据。

【问题讨论】:

  • 知道它的运行深度如何帮助您制作通用子程序?
  • 我不明白你想问什么。哈希哈希的“深度”是什么意思?
  • 你的意思是你想找到任意 HoH 的深度?首先决定如何计算周期的深度。然后以通常的方式编写 DFS 并计算深度标签。如果你试一试,它不起作用,然后你发布代码,你可能会得到一些有用的帮助。
  • 这感觉像是一个可能的 XY 问题。你想达到什么目的?
  • @UselessPerson: “所以为每个人编写 foreach 循环是一件苦差事” 然后你需要编写一些代码,而不是计算间接级别,实际上执行您需要的操作。我同意@Sobrique:如果您需要适当的帮助,那么您必须描述您的最终目标。你选错了方法:42 对任何人都没有用。

标签: perl hash-of-hashes


【解决方案1】:

假设一个统一的哈希结构:

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

【讨论】:

  • 您好 Melpomene,谢谢您的回答。这行得通。我刚试过。这完美地涵盖了我描述的要点。干杯,高拉夫
【解决方案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

【讨论】:

  • 嗨,Sukhoi,感谢您的代码。我试过了,它似乎有效,但我有一个问题。最后一项“$h{a}{b}{c}{d}{e1}{f1}{g} =1;”它似乎是 7 个级别,但程序仍然打印“6”。你能帮我理解吗?谢谢,高拉夫
  • 第一个哈希在0 级别,但您可以将其更改为从1 开始。
  • 是的。知道了!之前错过了零。所以是准确的。所以基本上它给出了哈希的最大级别。伟大的 !这就是我想要的。
猜你喜欢
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2017-03-29
  • 2015-04-16
相关资源
最近更新 更多