从数组创建哈希的多维键? [英] Create a multidimesional key of hash from array?
问题描述
我想从 @array
创建一个多维的 %hash
.
I want to create a multidimensional %hash
from the @array
.
假设 @array
就像
my @array=(1,2,3,4,5);
我想将 @array
最后一个值作为最终值分配给多维 %hash
即
I want to assign @array
last value as final value to multidimensional %hash
i.e
%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
.
Note : The @array
may be of any size, Just I want to assign last element of @array
as value to the keys of elements before the last element in %hash
.
推荐答案
首先,使用 pop
将要分配的值与键分开.然后,您可以使用以下任一方法:
First, use pop
to separate the value to assign from the keys. Then, you can use either of the following:
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
引用下一个值以取消引用和/或修改.
dive_val
works by having $p
reference the next value to dereference and/or modify.
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}
额外的间接级别有很多好处.
The extra level of indirection has many benefits.
- 它不需要特别对待最后一个键.
- 它消除了在取消引用之前创建哈希的需要.
- 它消除了将根作为对哈希的引用的需要.相反,任何标量都可以是根,甚至是未定义的.
- 它可以轻松扩展
dive_val
以支持混合数组/哈希结构.
- It removes the need to treat the last key specially.
- It removes the need to create the hash before it's dereferenced.
- It removes the need for the root to be a reference to a hash. Instead, any scalar can be the root, even an undefined one.
- It makes it easy to extend
dive_val
to support mixed array/hash structures.
这篇关于从数组创建哈希的多维键?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!