如何找到嵌套哈希的深度?
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
,它有两个键 one
和 two
。所以它是一个有两个级别的哈希。
我的问题是有没有什么办法可以测试并找到hash有两级的信息?
根据评论更新
关于 “让我相信我需要知道 Perl 散列的嵌套深度”的问题。这是我的情况。
该程序正在创建一个三层数据结构,并将其发布在一个文本文件中,供处理此已发布数据并执行其他操作的其他脚本使用。
程序还在读取其他五层数据结构并进行hash,其中有第一点hash相关的数据
该程序还在处理不断增长的日志文件并收集数据。
遍历哈希值和跟踪级别可以给出答案,
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
我正在尝试编写一个 Perl 子例程来处理任何给定的散列(通过引用传递),但我想让它成为一个通用的,以便我可以在任何地方使用它。
假设散列具有简单的 key/value 对并且不是详细记录(包含数组的数组或散列的数组),是否有任何方法可以找到散列的散列运行的深度?
例如
my %stat = (
1 => { one => "One is one.", two => "two is two"},
2 => { one => "second val wone", two => "Seconv v"}
);
上面的散列有一级键 1
,它有两个键 one
和 two
。所以它是一个有两个级别的哈希。
我的问题是有没有什么办法可以测试并找到hash有两级的信息?
根据评论更新
关于 “让我相信我需要知道 Perl 散列的嵌套深度”的问题。这是我的情况。
该程序正在创建一个三层数据结构,并将其发布在一个文本文件中,供处理此已发布数据并执行其他操作的其他脚本使用。
程序还在读取其他五层数据结构并进行hash,其中有第一点hash相关的数据
该程序还在处理不断增长的日志文件并收集数据。
遍历哈希值和跟踪级别可以给出答案,
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