Perl grep嵌套哈希递归
发布时间:2020-12-15 22:05:28 所属栏目:大数据 来源:网络整理
导读:我有这样的结构(散列哈希): %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",Level1_3= {
我有这样的结构(散列哈希):
%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",Level1_3=> { Level2_1 => "val1",Level2_2 => "val2",}); 我想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 : (); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |