从数组创建哈希的多维密钥?

Aru*_*ngh 2 arrays perl hash

我想从中创建一个多维%hash@array.

假设@array是这样的

my @array=(1,2,3,4,5);
Run Code Online (Sandbox Code Playgroud)

我想将@array最后一个值作为最终值分配给多维%hashie

%hash=(
        1=>{ 
              2=>
                 {
                  3=>
                      {
                        4=>5
                       }
                  }
              }
           )
Run Code Online (Sandbox Code Playgroud)

意思是 $hash{1}{2}{3}{4}=5;

我想这样做:

for my $i (0..$#array){
    #push $i as key until second last element and assign last element as value
} 
Run Code Online (Sandbox Code Playgroud)

注意:@array可以是任何大小,只是我想将最后一个元素@array作为值分配给最后一个元素之前的元素键%hash.

ike*_*ami 7

首先,用于pop将要分配的值与键分开.然后,您可以使用以下任一方法:

use Data::Diver qw( DiveVal );

my %hash;
DiveVal(\%hash, map \$_, @keys) = $val;
Run Code Online (Sandbox Code Playgroud)

要么

sub dive_val :lvalue {
   my $p = \shift;
   $p = \( $$p->{$_} ) for @_;
   $$p
}

my %hash;
dive_val(\%hash, @keys) = $val;
Run Code Online (Sandbox Code Playgroud)

dive_val通过$p引用下一个取消引用和/或修改的值来工作.

Pre-loop:            $p references $hash (the anon scalar referencing %hash)
After loop pass 0:   $p references $hash->{1}
After loop pass 1:   $p references $hash->{1}{2}
After loop pass 2:   $p references $hash->{1}{2}{3}
After loop pass 3:   $p references $hash->{1}{2}{3}{4}
Run Code Online (Sandbox Code Playgroud)

额外的间接水平有很多好处.

  • 它不需要特别处理最后一个密钥.
  • 它消除了在取消引用之前创建哈希的需要.
  • 它不需要root作为哈希的引用.相反,任何标量都可以是根,甚至是未定义的标量.
  • 它可以轻松扩展dive_val以支持混合数组/哈希结构.