【问题标题】:Create Multi Dimensional Hash Using Array Elements使用数组元素创建多维散列
【发布时间】:2016-05-06 15:14:25
【问题描述】:

我需要使用数组元素作为键来创建具有不同深度的多维散列。伪代码尝试:

示例行:

Statement Coverage 例如 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{"path"}{"with"}{"block"}{"and"} 现在的值为 "module"。请记住,键的数量可能会有所不同。有什么想法吗?

【问题讨论】:

标签: arrays perl hash


【解决方案1】:

这就是Data::Diver 为您所做的:

my @array = split /\//, $1;
DiveVal(\ my %hash, @array[ 0 .. $#array - 1 ]) = $array[-1];
print Dumper(\%hash);

【讨论】:

  • 谢谢,不幸的是,我的系统上没有安装该软件包,至少对于我们的 Perl 版本 5.8.8 而言,而且我们的 IT 部门非常不愿意升级。也许我可以在家里用笔记本电脑试试。
  • 5.8.8 是非常老的 perl 版本
【解决方案2】:

请参阅下面的代码。它递归地构建所需的哈希。

但我认为你采取了错误的方法。我显然不知道你到底想要实现什么,但在我看来,你应该使用树数据结构而不是多维哈希。

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(@_);
  }
}

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 2014-07-06
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多