如何从一系列数组中生成散列哈希值?我需要离开这个:
my @data = /one two three/;
my $value = 13:
到此:
$hoh = { 'one' => { 'two' => { 'three' => 13 } } };
这用于将数据库查询的输出转换为可视化的层次结构。因此,@ data的长度对于所有记录都是固定的,但因查询而异。
答案 0 :(得分:7)
假设您的意思是使用元素'初始化@data,'两个'和'三'上面,你可以做这样的事情:
my @data = qw/one two three/;
my $value = 13;
my $hash = $value;
$hash = {pop @data => $hash} while @data;
这样做是使用最终嵌套值初始化变量,然后使用从数据数组末尾弹出的键重复构建指向该变量内容的散列。
答案 1 :(得分:5)
使用List::Util的reduce函数向后构造hashref,创建一个hashref,它变为上部hashref的值,从$value
开始,它仍然是一个值,而不是一个键。这避免了对pop
:
my $d = reduce { +{ $b => $a } } ($value, reverse @data);
您可能需要通过将代码封闭在一个块中并使用
暂时关闭该块中的'Name "main::b" used only once: possible typo at '
警告来取消'once'
警告
no warnings 'once';
像这样:
use strict;
use warnings;
use List::Util 'reduce';
my @data = qw{one two three};
my $value = 13;
my $d = do {
no warnings 'once';
reduce { +{ $b => $a } } ($value, reverse @data);
};
答案 2 :(得分:0)
不像swestrup那样美观或紧凑,但可能更容易理解:
my @data = qw/one two three/;
my $value = 13;
my %h = ( ); # This is your final hash
my $deepest = undef;
my $hr = \%h;
for my $x (@data) {
$hr->{$x} = { };
$deepest = \$hr->{$x};
$hr = $hr->{$x};
}
$$deepest = $value;