数据库记录到哈希哈希

时间:2010-11-13 20:47:44

标签: perl

如何从一系列数组中生成散列哈希值?我需要离开这个:

my @data = /one two three/;
my $value = 13:

到此:

$hoh = { 'one' => { 'two' => { 'three' => 13 } } };

这用于将数据库查询的输出转换为可视化的层次结构。因此,@ data的长度对于所有记录都是固定的,但因查询而异。

3 个答案:

答案 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;