-1

私はこのようなハッシュを持っています:

{ ABC => [1, 2],
     1 => [11, 12,13,14],
     13 => [17,20] }

次のようなハッシュのハッシュを生成したい:

(ABC => { 1 => {11 => {},
                12 => {},
                13 => { 17 => {}
                        20 = {} },
                14 => {}
               },
          2 => {}
        }

)

上記のハッシュは、ルート ノードとさらに子ノードを持つツリーに他なりません。

すべての親ノードの子ノードをチェックするには、再帰を使用する必要があることを理解しています。以前ここで尋ねられた質問を見てきました。再帰中に特定のノードのデータが特定の親キーの下に格納される方法を理解できません。言い換えれば、ハッシュのハッシュを再帰的にどのように設定できますか?

ポインタや説明に感謝します。

御時間ありがとうございます

4

3 に答える 3

3

本当の問題は、自分が何を望んでいるのかわからないということです。

 {ABC => 1 => 11 => {}
     => 1 => 12 => {}
     => 1 => 13 => 17 => {}
                => 20 = {}
     => 1 => 14 => {}
} 

本当に奇妙な書き方です

{
   ABC => "1",
   11  => {},
   1   => "12",
   {}  => "1",
   13  => "17",
   {}  => "20",
   {}  => "1",
   14  => {},
}

それは意味がありません。私はあなたが実際に欲しいと思う

{
   ABC => {
      1 => {
         11 => {},
         12 => {},
         13 => {
            17 => {},
            20 => {},
         },
         14 => {},
      },
   },
}

必要なものがわかったので、それを実装することに挑戦する必要があります。

于 2012-08-07T19:00:49.797 に答える
1

ここで定義したコードを使用できます: Perl で複数のハッシュを 1 つのハッシュにマージするにはどうすればよいですか?

そう定義@hash_listした:

my @hash_list 
    = { map { ref() eq 'ARRAY' ? { map {; $_ => {} } @$_ } : $_ } 
        %{{ ABC => [1, 2]
          ,  1  => [11, 12,13,14]
          , 13  => [17,20] 
          }}
      };
于 2012-08-07T23:11:59.877 に答える
1
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my %data = (
    ABC => [1, 2],
     1  => [11, 12, 13, 14],
     13 => [17, 20] 
);
my %hash;

sub modify_hash {
    my ($base, $ref) = @_;
    for my $k (keys %$ref) {
        if (exists $base->{$k}) {
            $ref->{$k} = $base->{$k};
            delete $base->{$k};
        }
        modify_hash($base, $ref->{$k});
    }
}

map { %{$hash{$_}} = map { $_ => {}; } @{$data{$_}}; } keys %data;
map { modify_hash(\%hash, $hash{$_}); } keys %hash;
print Dumper(\%hash);

出力:

$VAR1 = {
          'ABC' => {
                     '1' => {
                              '11' => {},
                              '13' => {
                                        '17' => {},
                                        '20' => {}
                                      },
                              '12' => {},
                              '14' => {}
                            },
                     '2' => {}
                   }
        };
于 2012-08-08T13:27:00.683 に答える