2009-08-12 13 views
5

私はこのようなYAMLドキュメント持っている:私は何のPerlデバッガでスクリプトを起動から見PerlのYAML :: TinyでYAMLツリーをどのように歩くことができますか?

$configuration = YAML::Tiny->read($configuration_file) 

--- 
version: 1 
rootdirectory: 
    - subdirectory: 
    - file1 
    - file2 
    - subdirectory2 

私はYAMLにロードしています::このような小さなオブジェクトを私はで終わるYAMLソースの構造を反映して、ネストされたハッシュと配列のセットです:だから

0 YAML::Tiny=ARRAY(0x84e3ba4) 
    0 HASH(0x80627dc) 
     'rootdirectory' => ARRAY(0x84e3d3c) 
     0 HASH(0x84352b0) 
      'subdirectory' => ARRAY(0x84e3df0) 
       0 'file1' 
       1 'file2' 
     1 'subdirectory2' 
     'version' => 1 

、私はPRずに次のようなことを行うことができます表記:

print $configuration->[0]->{version} 

となり、期待される回答は「1」となります。同様に、次のようにもできます。

print $configuration->[0]->{rootdirectory}->[0]->{subdirectory}->[0] 

となり、期待される回答が 'file1'になります。

私の問題は、上の例で私のファイル名を得るために必要な先験的な知識から来ています。スクリプトのユーザがYAML設定の任意のディレクトリ構造を記述できるようにしようとしているので、これでは十分ではありません。私は「ルートディレクトリ」からツリーを「歩く」ことができる必要があります。

だから、私はこのような何かをやっている可能性が想像しただろう:

私は戻ってきたと期待しているだろう
print keys($configuration->[0]) 

「RootDirectoryは、バージョン」...というように、配列を反復処理し、私が木を歩くまではハッシュ。

私は上記の例を実行しようとすると、私が手:

Type of arg 1 to keys must be hash (not array element) 

私はこだわっています。この時点で。私が理解しているように、$ configuration - > [0]は配列の要素ですが、キーの関数を呼び出すことができるはずのハッシュを含む要素です。

私はここで何が欠けていますか?

答えて

5

あなたは "%{...}" だから

はそれらを反復するとハッシュリファレンスに配列要素 " $configuration->[0]" を強制する必要

print "$_\n" for keys %{ $configuration->[0] }; 

試してみてください。

for my $key (keys %{ $configuration->[0] }){ 
    my $value = $configuration->[0]{$key}; 

    print "$key => $value\n"; 
} 
+0

優秀、ありがとう! 私はこれを理解しているので、基本的には、$ configuration - > [0]は実際にはハッシュであり、配列要素ではないとPerlに確信させるために、%{$ configuration - > [0]}の形式で "ハッシュを含むことになります。 これは公正なコメントですか? –

+0

はい –

+0

キーワード 'keys()'は 'keys(\%){...}'のように定義されています。これはハッシュを強制的に使用しますが、自動参照はしません。 –

3

YAML::Tinyが作成されますかなり複雑なデータ構造:

配列 をハッシュへの参照の完全な を配列への参照を完全に をハッシュへの参照の完全な ....

への参照$aは、配列への参照である、 あなたのように全体の配列にアクセスします@ $ a と要素は$$a[0], $$a[1], ... または$configurationがあるとき、代わり$a->[0], $a->[1]

$bはハッシュへのreferencがあるとして、 あなたは%$b として全体のハッシュと$b->{'somekey'}, $b->{'somekey'}

として$ $b{'somekey'}, $$b{'somekey'}, .... または代わりとして要素にアクセス ハッシュへの参照の完全な配列への参照@$configuration$configuration->[0]として配列全体にアクセスします。あなただけの別の変数に

$firstconfig = $configuration->[0] 

、その後は

%$firstconfig 

として全体のハッシュにアクセスすることをコピーしていますが1でそれをしたい場合は、かなりトリッキーを記述する必要が行くことができる

%{ $configuration->[0] } 

これはPerl 6のために削除されたものの1つだと思います。

+0

いくつかは変更されていますが、Perl6にはまだいくつか存在しています。 –

+0

YAML :: Tinyはシリアル化されたデータ構造を再構築するだけです。複雑さの原因は、YAMLドキュメントが解析されることです。 –

+0

これは私に多くのsoooooを助けた。私はperlreututとperldscを読んでいて、ハッシュと配列の参照と実際のデータは見当たりませんでした。私はまだ完全に理解していませんが、少なくとも私は答えからの啓発に私の道を行くことができます。 – djeikyb

関連する問題