0

私はこの出力を持っていますDumper

'group' => {
             '1104' => {
                         'a' => 1
                       },
             '52202' => {
                          'b' => 1,
                          'c' => 1
                        },
             '52201' => {
                          'c' => 1
                        },
             '52200' => {
                          'c' => 1
                        }
           },

ハッシュの配列のハッシュの配列だと思いますか?

この構造を自分で宣言したいと思います。

これを行う方法はありますか?次にこのような複雑な構造を見たときに、すぐにそれを行うことができますか? =)

4

2 に答える 2

11

出力はハッシュのハッシュのハッシュであり、最初のハッシュには単一の要素のみが含まれています。{}ハッシュ参照をマークするため、データ構造をこのように繰り返すと、結果は$hohohHoHoH への参照になります。

my $hohoh = {
    'group' => {
         '1104' => {
                     'a' => 1
                   },
         '52202' => {
                      'b' => 1,
                      'c' => 1
                    },
         '52201' => {
                      'c' => 1
                    },
         '52200' => {
                      'c' => 1
                    }
       },
};
print $hohoh->{group}{1104}{a}; # -> 1

Perl Datastructures Cookbookを読むことをお勧めします。

于 2011-02-07T13:52:50.397 に答える
2

Perl では変数の型とハッシュ値の型が変わる可能性があるため、おそらくあなたが考えているような方法で 3 レベルのハッシュを「宣言」する方法はありません。空の hashref を作成時に各キーにインスタンス化できます。これは同様の考え方です。

# First pass
my $data = {};

# Later...
$data->{group} = {};

# Still later...
$data->{group}->{1104} = {};

# Finally... 
$data->{group}->{1104}->{a} = 1;

しかし、データを取得するのと同じくらい簡単にデータを入力することができ、autovivification がそのことを実行できるようになります。

my $data;

# Fill one piece of data... Perl creates all three hash levels now.
$data->{group}->{1104}->{a} = 1; 

# Fill another piece of data, this one has two values in the "bottom" hash.
$data->{group}->{52202} = { b => 1, c => 2};

しかし、特定のキーの値に、文字列やサブルーチン参照ではなくハッシュが含まれていることを「強制」する方法は (単純な Perl では) ありません。これは通常、C のような型システムを持つ言語で宣言によって意図されていることです。

于 2011-02-07T14:26:49.137 に答える