2016-05-05 7 views
0

配列要素をキーとしてさまざまな深度の多次元ハッシュを作成する必要があります。擬似コードの試み:配列要素を使用した多次元ハッシュの作成

例線:例えば

ステートメントカバレッジ/ブロック/と/モジュール...

if (/Statement Coverage for instance (.&?) /) 
{ 
@array = split /\//, $1; 
} 

for (my $eye = 1; $eye <= $#array; $eye++) 
{ 
A miracle happens to %hash! 
} 

$ハッシュ{ "パス"}、{ "と" と階層/パス/ } {"block"} {"と"}は現在 "module"の値を持ちます。鍵の数はさまざまです。何か案は?

+1

あなたが何を求めているかは完全にはっきりしていません。 [mcve]の作成方法については、こちらをご覧ください。また、 '$ eye'? –

答えて

2

Data::Diverがあなたのために何をするかです:

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

残念ながら、残念ながらそのパッケージは私のシステムにはインストールされていません。少なくともPerlのrev 5.8.8用であり、私たちのIT部門はアップグレードすることを非常に嫌っています。たぶん私はラップトップで自宅で試すことができます。 – hal9e3

+0

5.8.8はperlの非常に古いバージョンです – Sobrique

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(@_); 
    } 
} 
関連する問題