{ Level3_1 => "val2", -6ren">
gpt4 book ai didi

Perl grep 嵌套哈希递归

转载 作者:行者123 更新时间:2023-12-02 09:59:30 24 4
gpt4 key购买 nike

我的结构如下所示(哈希值的哈希值):

%hash=(
Level1_1=> {
Level2_1 => "val1",
Level2_2=> {
Level3_1 => "val2",
Level3_2 => "val1",
Level3_3 => "val3",
},
Level2_3 => "val3",
},
Level1_2=> {
Level2_1 => "val1",
Level2_2=> {
Level3_1 => "val1",
Level3_2 => "val2",
Level3_3 => "val3",
},
Level2_3 => "val3",
},
Level1_3=> {
Level2_1 => "val1",
Level2_2 => "val2",
Level2_3 => "val3",
});

我想 grep 这个由“val2”过滤的嵌套结构输出应该是:

%result=(
Level1_1=> { Level2_2=> { Level3_1 => "val2"} },
Level1_2=> { Level2_2=> { Level3_2 => "val2" } },
Level1_3=> { Level2_2 => "val2" }
);

我的第一个想法是使用这样的递归子例程:

hashwalk_v( \%hash );
sub hashwalk_v
{
my ($element, @array) = @_;
if( ref($element) =~ /HASH/ )
{
while (my ($key, $value) = each %$element)
{

if( ref($value) =~ /HASH/ ) {
push (@array, $key);
hashwalk_v($value, @array);
} else {
if ( $value =~ "val2") {
push (@array, $key);
print $_ . "\n" for @array;
} else {
@array ="";
}
}
}
}
}

但不幸的是我无法保存上一个循环中的哈希键。有什么想法吗??

最佳答案

类似的方法,

use Data::Dumper; print Dumper hfilter(\%hash, "val2");

sub hfilter {
my ($h, $find) = @_;
return if ref $h ne "HASH";

my %ret = map {
my $v = $h->{$_};
my $new = ref($v) && hfilter($v, $find);

$new ? ($_ => $new)
: $v eq $find ? ($_ => $v)
: ();

} keys %$h;

return %ret ? \%ret : ();
}

关于Perl grep 嵌套哈希递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19629513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com