加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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 : ();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读