私はこのようなYAMLドキュメントを持っています:
---
version: 1
rootdirectory:
- subdirectory:
- file1
- file2
- subdirectory2
次のようなYAML::Tinyオブジェクトにロードしています。
$configuration = YAML::Tiny->read($configuration_file)
Perlデバッガーでスクリプトを呼び出すと、最終的には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
だから、私は問題なく次のようなことをすることができます:
print $configuration->[0]->{version}
そして、「1」の期待される答えを受け取ります。同様に、私も行うことができます:
print $configuration->[0]->{rootdirectory}->[0]->{subdirectory}->[0]
'file1'の期待される答えを受け取ります。
私の問題は、上記の例でファイル名を導出するために必要なすべての先験的な知識に起因します。スクリプトのユーザーがYAML構成で任意のディレクトリ構造を記述できるようにしようとしているので、これでは十分ではありません。'rootdirectory'からツリーを「ウォーク」できるようにする必要があります。
だから、私はこのようなことをすることができたと想像したでしょう:
print keys($configuration->[0])
'rootdirectory、version' ...などを返し、ツリーを歩くまで配列とハッシュを繰り返し処理することを期待していました。
上記の例を実行しようとすると、次のようになります。
Type of arg 1 to keys must be hash (not array element)
この時点で私は立ち往生しています。私が理解しているように、$ configuration-> [0]は配列の要素でありながら、キー関数を呼び出すことができるはずのハッシュを含む要素です。
ここで何が欠けていますか?