我需要钥匙的平面列表转换成一个嵌套的哈希值,如下:
我的$哈希= {};
我的@array = QW(KEY1 KEY2值的lastKey);
ToNestedHash($哈希,@array);
这样做:
$哈希{ 'KEY1'} { 'KEY2'} { '的lastKey'} = “值”;
我需要钥匙的平面列表转换成一个嵌套的哈希值,如下:
我的$哈希= {};
我的@array = QW(KEY1 KEY2值的lastKey);
ToNestedHash($哈希,@array);
这样做:
$哈希{ 'KEY1'} { 'KEY2'} { '的lastKey'} = “值”;
sub to_nested_hash {
my $ref = \shift;
my $h = $$ref;
my $value = pop;
$ref = \$$ref->{ $_ } foreach @_;
$$ref = $value;
return $h;
}
说明:
我们知道:
my $h = {}; my $a = [];
这可能是更明确的做到这一点:
foreach my $key ( @_ ) {
my $lvl = $$ref = {};
$ref = \$lvl->{ $key };
}
但是,由于重复使用这些引用的成语,我写这句话完全,因为它是和发布前测试它,而不会出现错误。
作为替代方案,下面的版本是“容易”(想出)
sub to_nested_hash {
$_[0] //= {};
my $h = shift;
my $value = pop;
eval '$h'.(join '', map "->{\$_[$i]}", 0..$#_).' = $value';
return $h;
}
但是约6-7倍慢。
Thxs的好东西!
我这样做,是递归的方式:
sub Hash2Array
{
my $this = shift;
my $hash = shift;
my @array;
foreach my $k(sort keys %$hash)
{
my $v = $hash->{$k};
push @array,
ref $v eq "HASH" ? $this->Hash2Array($v, @_, $k) : [ @_, $k, $v ];
}
return @array;
}
这将是有趣的,有所有这些解决方案之间的性能比较...
我认为这个代码是更好 - 更适合于移动到一个类的方法,和任选地设置一个值,这取决于所提供的参数。 否则,所选择的答案是整齐的。
#!/usr/bin/env perl
use strict;
use warnings;
use YAML;
my $hash = {};
my @array = qw(key1 key2 lastKey);
my $val = [qw/some arbitrary data/];
print Dump to_nested_hash($hash, \@array, $val);
print Dump to_nested_hash($hash, \@array);
sub to_nested_hash {
my ($hash, $array, $val) = @_;
my $ref = \$hash;
my @path = @$array;
print "ref: $ref\n";
my $h = $$ref;
$ref = \$$ref->{ $_ } foreach @path;
$$ref = $val if $val;
return $h;
}