首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何挖掘出一定的散列深度?

如何挖掘出一定的散列深度?
EN

Stack Overflow用户
提问于 2015-06-03 20:42:32
回答 1查看 126关注 0票数 3

我不知道它的深度。我是用DBI::selectall_hashref获得的,其中第二个参数由用户提供。

因此,根据查询的不同,对于2级哈希,我可以得到类似的内容。

代码语言:javascript
复制
hash_ref = (
   aphrodite => (
      foo => (
         name => aphrodite,
         foobar => foo
         a => 1,
         b => 2,
      )
      bar => (
         name => aphrodite,
         foobar => bar
         a => 1,
         b => 2,
      )
   )
   apollo => (
      ...
   )
   ares => (
      ...
   )
)

如您所见,key列在哈希中是多余的。我想移除多余的钥匙。

如果我知道这是一个2级哈希,那么我可以很容易地解决我的问题:

代码语言:javascript
复制
for my $name (keys $hash_ref) {
    for my $foobar (keys $hash_ref->{$name}) {
        my $h = $hash_ref->{$name}{$foobar};
        delete $h->{name};
        delete $h->{foobar};
    }
}    

但是,对于3级散列,我需要3级级联的循环等等。

如何动态地从$hash_ref ( namefoobar )中删除冗余密钥?

我最初的想法是在散列中递归地迭代:

代码语言:javascript
复制
iterate($hash_ref, scalar @keys);
sub iterate {
    my ($ref, $depth) = @_;
    for(keys $ref) {
        if ($depth > 0) { 
            iterate($ref->{$_}, $depth - 1);  
        } 
        else {
            delete $ref->{$_} for(@keys);
        }
    }
}  

很管用,但很丑,很丑.在更进一步之前,我想知道我是否漏掉了什么。也许解决办法可能比我想的要简单得多。

有什么想法吗?

更多细节?

我正在编写一个数据库取取器,它接受包含SQL查询$sql和散列键@keys的用户配置。因此,我从数据库中获得了以下值:

代码语言:javascript
复制
$dbh->selecthall_hashref($sql, \@keys, {}, @bind);

我还必须根据附加信息清理获取的数据。一定要应用这些规则,我必须迭代到最深级别的$hash_ref来访问键/值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-03 21:33:38

我觉得这能满足你的需要。本质上,它通过哈希循环,直到找到一个哈希值不是引用的层。然后,它使用@keys中的键从该层删除元素。

代码语言:javascript
复制
use strict;
use warnings;
use 5.010;

use Data::Dump;
use List::Util 'any';

my $hash_ref = {
  aphrodite => {
    bar => { name => "aphrodite", foobar => "bar", a => 3, b => 4, },
    foo => { name => "aphrodite", foobar => "foo", a => 1, b => 2, },
  },
  apollo => {
    bar => { name => "apollo",    foobar => "bar", a => 7, b => 8, },
    foo => { name => "apollo",    foobar => "foo", a => 5, b => 6, },
  },
  ares => {
    bar => { name => "ares",      foobar => "bar", a => 11, b => 12, },
    foo => { name => "ares",      foobar => "foo", a => 9,  b => 10, },
  },
};

my @keys = qw/ name foobar /;

remove_dups($hash_ref, \@keys);

dd $hash_ref;

sub remove_dups {
  my ($href, $keys) = @_;
  if ( any { ref } values %$href ) {
    remove_dups($_, $keys) for values %$href;
  }
  else {
    delete @{$href}{@$keys};
  }
}

输出

代码语言:javascript
复制
{
  aphrodite => { bar => { a => 3, b => 4 }, foo => { a => 1, b => 2 } },
  apollo => { bar => { a => 7, b => 8 }, foo => { a => 5, b => 6 } },
  ares => { bar => { a => 11, b => 12 }, foo => { a => 9, b => 10 } },
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30630271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档