私はこのような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]は配列の要素ですが、キーの関数を呼び出すことができるはずのハッシュを含む要素です。
私はここで何が欠けていますか?
優秀、ありがとう! 私はこれを理解しているので、基本的には、$ configuration - > [0]は実際にはハッシュであり、配列要素ではないとPerlに確信させるために、%{$ configuration - > [0]}の形式で "ハッシュを含むことになります。 これは公正なコメントですか? –
はい –
キーワード 'keys()'は 'keys(\%){...}'のように定義されています。これはハッシュを強制的に使用しますが、自動参照はしません。 –