gpt4 book ai didi

perl - 如何干净地将嵌套的 Perl 哈希转换为非嵌套的哈希?

转载 作者:行者123 更新时间:2023-12-04 10:06:01 26 4
gpt4 key购买 nike

假设一个嵌套的哈希结构 %old_hash ..

my %old_hash;
$old_hash{"foo"}{"bar"}{"zonk"} = "hello";

.. 我们希望使用 sub &flatten(...) 将其“扁平化”(抱歉,如果这是错误的术语!)以便 ..
my %h = &flatten(\%old_hash);
die unless($h{"zonk"} eq "hello");

以下定义 &flatten(...)诀窍:
sub flatten {
my $hashref = shift;
my %hash;
my %i = %{$hashref};
foreach my $ii (keys(%i)) {
my %j = %{$i{$ii}};
foreach my $jj (keys(%j)) {
my %k = %{$j{$jj}};
foreach my $kk (keys(%k)) {
my $value = $k{$kk};
$hash{$kk} = $value;
}
}
}
return %hash;
}

虽然给出的代码有效,但它不是很可读或干净。

我的问题有两个:
  • 给定的代码在哪些方面不符合现代 Perl 最佳实践?严厉点! :-)
  • 你会如何清理它?
  • 最佳答案

    您的方法不是最佳实践,因为它无法扩展。如果嵌套散列是六、十级深怎么办?重复应该告诉您递归例程可能是您所需要的。

    sub flatten {
    my ($in, $out) = @_;
    for my $key (keys %$in) {
    my $value = $in->{$key};
    if ( defined $value && ref $value eq 'HASH' ) {
    flatten($value, $out);
    }
    else {
    $out->{$key} = $value;
    }
    }
    }

    或者,好的现代 Perl 风格是尽可能使用 CPAN。 Data::Traverse会做你需要的:
    use Data::Traverse;
    sub flatten {
    my %hash = @_;
    my %flattened;
    traverse { $flattened{$a} = $b } \%hash;
    return %flattened;
    }

    最后要注意的是,通过引用传递散列通常更有效,以避免它们被扩展为列表,然后再次变成散列。

    关于perl - 如何干净地将嵌套的 Perl 哈希转换为非嵌套的哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2495653/

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