我需要使用数组元素作为键来创建具有不同深度的多维哈希。伪代码尝试:
示例行:
语句覆盖范围,例如Hierarchical / path / with / block / and / module ...
if (/Statement Coverage for instance (.&?) /)
{
@array = split /\//, $1;
}
for (my $eye = 1; $eye <= $#array; $eye++)
{
A miracle happens to %hash!
}
$ hash {&#34; path&#34;} {&#34; with&#34;} {&#34; block&#34;} {&#34;和&#34;}现在的值为&#34;模块&#34 ;.请记住,键的数量可能会有所不同。有什么想法吗?
答案 0 :(得分:2)
这就是Data::Diver为你做的事情:
my @array = split /\//, $1;
DiveVal(\ my %hash, @array[ 0 .. $#array - 1 ]) = $array[-1];
print Dumper(\%hash);
答案 1 :(得分:1)
请参阅下面的代码。它以递归方式构建所需的哈希值。
但我认为你采取了错误的做法。我显然不知道你想要实现什么,但在我看来,你应该使用树数据结构而不是多维哈希。
use strict;
use warnings;
use v5.10;
use Data::Dumper;
my @data = (
'some/path/test',
'some/path/deeper/test',
'another/deeper/path/test',
);
my $resultHr = {};
foreach my $path (@data) {
my @elems = split /\//, $path;
buildHash($resultHr, @elems);
}
say Dumper($resultHr);
sub buildValue {
my $n = shift;
if (@_) {
return {$n => buildValue(@_)};
}
else {
return $n;
}
}
sub buildHash {
my $hr = shift;
my $k = shift;
return unless $k;
if (exists $hr->{$k} && ref $hr->{$k}) {
buildHash($hr->{$k}, @_);
}
else {
$hr->{$k} = buildValue(@_);
}
}