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

Chr*_*phe 4 perl perl-data-structures

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

我的$ hash = {};

我的@array = qw(key1 key2 lastKey Value);

ToNestedHash($ hash,@ array);

会这样做:

$ hash {'key1'} {'key2'} {'lastKey'} ="价值";

Axe*_*man 11

sub to_nested_hash {
    my $ref   = \shift;  
    my $h     = $$ref;
    my $value = pop;
    $ref      = \$$ref->{ $_ } foreach @_;
    $$ref     = $value;
    return $h;
}
Run Code Online (Sandbox Code Playgroud)

说明:

  • 将第一个值作为hashref
  • 将最后一个值作为要分配的值
  • 其余的都是钥匙.
  • 然后创建对基本哈希的SCALAR引用.
  • 反复:
    • 取消引用指针以获取哈希值(第一次)或将指针自动生成为哈希值
    • 获取密钥的哈希槽
    • 并将标量引用分配给哈希槽.
    • (下一次将围绕这个将自动生成到指示的哈希).
  • 最后,通过引用最里面的槽,分配值.

我们知道:

  • 哈希或数组的占用者只能是标量或引用.
  • 参考是各种标量.(my $h = {}; my $a = [];).
  • 因此,\ $ h - > {$ key}是对堆上标量槽的引用,可能是自动生成的.
  • 如果我们这样解决嵌套哈希的"级别",则可以将其自动生成哈希引用.

这样做可能更明确:

foreach my $key ( @_ ) { 
    my $lvl = $$ref = {};
    $ref    = \$lvl->{ $key };
}
Run Code Online (Sandbox Code Playgroud)

但是由于反复使用这些参考习语,我完全按原样编写了该行并在发布之前对其进行了测试,没有错误.

至于替代品,以下版本"更容易"(想一想)

sub to_nested_hash {
    $_[0] //= {};
    my $h     = shift;
    my $value = pop;
    eval '$h'.(join '', map "->{\$_[$i]}", 0..$#_).' = $value';
    return $h;
}
Run Code Online (Sandbox Code Playgroud)

但大约慢6-7倍.