gpt4 book ai didi

perl - 如何挖掘到一定的哈希深度?

转载 作者:行者123 更新时间:2023-12-02 01:37:09 26 4
gpt4 key购买 nike

我有一个哈希,但我不知道它的深度。我用 DBI::selectall_hashref 得到它,其中第二个参数由用户提供。

因此,根据查询,我可以为 2 级哈希使用类似这样的内容。

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 级散列,我可以很容易地解决我的问题:

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 个级联的 for 循环等等。

How can I dynamically remove the redundant keys from $hash_ref i.e. name and foobar?

我最初的想法是通过我的哈希递归迭代:

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

它有效,但它很丑,非常丑……在继续之前,我想知道我是否遗漏了什么。也许解决方案比我想的要简单得多。

有什么想法吗?

更多详情?

我正在编写一个数据库 getter ,它采用包含 SQL 查询 $sql 和散列键 @keys 的用户配置。所以我从数据库中获取值:

$dbh->selecthall_hashref($sql, \@keys, {}, @bind);

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

最佳答案

我认为这可以满足您的需求。本质上,它通过散列递归,直到找到散列值未被引用的层。然后它使用 @keys

中的键从该层中删除元素
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};
}
}

输出

{
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 } },
}

关于perl - 如何挖掘到一定的哈希深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30630271/

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