2016-08-24 24 views
0

私は、未知数のさまざまなオブジェクトを含む設定ファイル用の設定パーサーを作成しています。すべてが独自のフィールドと値のペアを持っています。ハッシュの内容を別の大きなハッシュにコピーする

ObjectType1 
    name Alpha 
    host 127.0.0.1 
ObjectType1 
    name Beta 
    host 10.11.12.13 
ObjectType2 
    name AlphaPolicy 
    type This 
    useExtraWidgets true 

だから私は素晴らしい作品フィールド/値のハッシュに個々のオブジェクトを解析しようとしている:

設定ファイルは次のようになります。私を引きつけているのは、個々のオブジェクトを追加して全体の構成を保持する大きなハッシュにしたいということです。このより大きなハッシュは、特定のオブジェクトのフィールド/値を保持する各オブジェクト型の配列を持つ必要があります。私はフィールド/値のハッシュをより大きなハッシュに合理的な方法でプッシュする方法を考え出すことはできません。

ここにコメント付きの擬似コードがあります。誰かが@s、$ s、括弧などが必要な場所で助けてくれますか?実際には動作しないので、擬似コードと呼びます。何も印刷しません。ありがとう。

my %hash1,%hash2; 

$hash2{'name'} = "Alpha"; 
$hash2{'host'} = "127.0.0.1"; 
push @{$hash1{'ObjectType1'}}, %hash2; 

undef %hash2; 

$hash2{'name'} = "Beta"; 
$hash2{'host'} = "10.11.12.13"; 
push @{$hash1{'ObjectType1'}}, %hash2; 

undef %hash2; 

$hash2{'name'} = "AlphaPolicy"; 
$hash2{'type'} = "this"; 
$hash2{'useExtraWidgets'} = "true"; 
push @{$hash1{'ObjectType2'}}, %hash2; 

print $hash1{'ObjectType1'}[0]{'name'}; #I want this to print "Alpha" 
print $hash1{'ObjectType1'}[1]{'host'}; #I want this to print "10.11.12.13" 
print $hash1{'ObjectType2'}[0]{'name'}; #I want this to print "AlphaPolicy" 
+0

あなたの変数には、 '%hash1'や'%hash2'よりも優れた名前を作るべきです。 – Borodin

+0

ああ、間違いなく。これは単なる人工テストケースです。 – largesock

+0

あなたが世界の消費のためにここに書いたサンプルの "人工的な"コードは非常に貧弱な識別子を持っているのに対し、あなた自身と他のいくつかの人によって読み込まれる最終的なコードは(おそらく) 。 – Borodin

答えて

0

Perlでデータ構造をネストするときは、構造自体ではなく構造への参照を格納する必要があります。あなたは、例えば、印章をエスケープすることにより、Perlでの変数への参照を取る:

my (%hash1, %hash2); 

$hash2{'name'} = "Alpha"; 
$hash2{'host'} = "127.0.0.1"; 
push @{$hash1{'ObjectType1'}}, \%hash2; # n.b. the \ 

後でこれらの値にアクセスしようとすると、矢印の中置演算子(->)でそれらを間接参照する必要があります:

say $hash1{ObjectType1}->[0]->{name}; 

つまり、$hash1{ObjectType1}に格納されている配列を逆参照し、最初の要素を取ります。その要素に格納されているハッシュを逆参照し、nameキーを取得します。現代のPerlはそう、あなたのバージョンに応じて、これは動作するはずです、矢印の中置演算子(いくつかのケースでは、私がいる限り、「頭」は、参照そのものではないと思う)あなたが崩壊しても、省略してみましょう:

say $hash1{ObjectType1}->[0]{name}; 

そして、おそらくは、これは:

say $hash1{ObjectType1}[0]{name}; 

私は非常にあなたには、いくつかの時間があるときperlref [tut]、perllol、およびperldscを読んで推薦します!

+0

* "これらの値に後でアクセスしようとするときは、矢印挿入演算子で逆参照する必要があります。" *これは必須ではありません。閉じ括弧と中括弧の間の矢印はオプションで、OPが要求した構文はうまくいきます。 – Borodin

+0

ありがとうございます。私は大学で約15年前に本当にPerlを真剣に研究しました。これは主に機能的なレベルの知識ですが、ポインタ、矢印演算子などを使用しなければならない場合は、それが得られます。これにより、物事が大幅に明確化され、さらに読むためのリンクも高く評価されます。 – largesock

関連する問題