gpt4 book ai didi

Perl:如何将数组转换为嵌套的哈希键

转载 作者:行者123 更新时间:2023-12-04 22:34:12 25 4
gpt4 key购买 nike

我需要将键的平面列表转换为嵌套的哈希,如下所示:

my $hash = {};

my @array = qw(key1 key2 lastKey Value);

ToNestedHash($hash, @array);



会这样做:

$hash{'key1'}{'key2'}{'lastKey'} = "Value";

最佳答案

sub to_nested_hash {
my $ref = \shift;
my $h = $$ref;
my $value = pop;
$ref = \$$ref->{ $_ } foreach @_;
$$ref = $value;
return $h;
}

解释:
  • 取第一个值作为 hashref
  • 取最后一个值作为要赋值的值
  • 剩下的就是key了。
  • 然后创建对基本哈希的 SCALAR 引用。
  • 重复:
  • 取消引用指针以获取散列(第一次)或将指针自动激活为散列
  • 获取 key
  • 的哈希槽
  • 并将标量引用分配给哈希槽。
  • (下次将自动激活到指定的哈希值)。
  • 最后,引用最里面的槽,赋值。

  • 我们知道:
  • 表示散列或数组的占用者只能是标量或引用。
  • 引用是某种标量。 ( my $h = {}; my $a = []; )。
  • 所以,\$h->{ $key } 是对堆上一个标量槽的引用,可能是自动激活的。
  • 如果我们这样处理,嵌套散列的“级别”可以自动激活为散列引用。

  • 这样做可能更明确:
    foreach my $key ( @_ ) { 
    my $lvl = $$ref = {};
    $ref = \$lvl->{ $key };
    }

    但是由于重复使用这些引用习语,我完全照原样写了这行,并在发布前对其进行了测试,没有错误。

    至于替代方案,以下版本“更容易”(想出来)
    sub to_nested_hash {
    $_[0] //= {};
    my $h = shift;
    my $value = pop;
    eval '$h'.(join '', map "->{\$_[$i]}", 0..$#_).' = $value';
    return $h;
    }

    但大约慢 6-7 倍。

    关于Perl:如何将数组转换为嵌套的哈希键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505100/

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