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

时间:2015-07-22 05:55:03

标签: arrays perl hash

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

假设@array就像

my @array=(1,2,3,4,5);

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

%hash=(
        1=>{ 
              2=>
                 {
                  3=>
                      {
                        4=>5
                       }
                  }
              }
           )

这意味着$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
} 

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

1 个答案:

答案 0 :(得分:7)

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

use Data::Diver qw( DiveVal );

my %hash;
DiveVal(\%hash, map \$_, @keys) = $val;

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

my %hash;
dive_val(\%hash, @keys) = $val;

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}

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

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