6

私はこのような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]は配列の要素でありながら、キー関数を呼び出すことができるはずのハッシュを含む要素です。

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

4

2 に答える 2

6

試す

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

配列要素 " " を " "$configuration->[0]のハッシュ参照に強制する必要があります%{...}

したがって、それらを反復するには:

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

  print "$key => $value\n";
}
于 2009-08-12T16:38:23.953 に答える
3

YAML::Tinyかなり複雑なデータ構造を作成します。

ハッシュへの参照でいっぱいの配列への参照ハッシュへの参照でいっぱいの配列への参照でいっぱい...。

$a配列への参照である場合、配列全体に@ $ aとしてアクセスし、要素に$$a[0], $$a[1],...または代わりにとしてアクセスします。$a->[0], $a->[1]

$bハッシュへの参照である場合、ハッシュ全体にアクセスし%$b 、要素に$ $b{'somekey'}, $$b{'somekey'},....または代わりにとしてアクセスします。$b->{'somekey'}, $b->{'somekey'}

$configurationハッシュへの参照でいっぱいの配列への参照である場合、配列全体にとしてアクセスし@$configuration、最初の要素にとしてアクセスします$configuration->[0]。それを別の変数にコピーすることができます

$firstconfig = $configuration->[0]

次に、ハッシュ全体に次のようにアクセスします

%$firstconfig

しかし、一度にそれをやりたいのなら、あなたはかなりトリッキーなことを書かなければなりません

%{ $configuration->[0] }

これはPerl6で削除されたものの1つだと思います。

于 2009-08-12T16:56:31.917 に答える