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