我想从中创建一个多维%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.
首先,用于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)
额外的间接水平有很多好处.
dive_val以支持混合数组/哈希结构.