【问题标题】:Create a multidimesional key of hash from array?从数组创建散列的多维键?
【发布时间】:2015-10-11 20:14:39
【问题描述】:

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

假设@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 中最后一个元素之前的元素键。

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    首先,使用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}
    

    额外的间接层有很多好处。

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

    【讨论】:

    • 很抱歉没有接受这条线$p = \( $$p->{$_} ) for @_;$$p 是 hashref,$$p->$_ 是 value,之后我没有得到 \() 什么?
    • $$p 可以是 hashref,但不一定。在循环内,它可以是 undef 或哈希引用。在循环结束时,它可以是任何东西。 \ 获得参考。括号只是为了覆盖优先级。
    • 以及为什么你在这里引用哈希my $p = \shift;
    • 因为这就是我们所需要的。看答案中的图表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多