2011-06-03 6 views
6

私は単純な概念上の問題のように見えます。似たような問題をWebやStack Overflowで徹底的に探したところ、似たようなものは見つからなかったので、私はあなたに尋ねることができると思った。どのように再帰的に入れ子になったハッシュデータ構造を歩くのですか?

私は深くネストされたハッシュデータ構造のハッシュのハッシュを構築しています。深さは10〜20倍にすることができます。この問題のために、私は深さ1までしかリストアップしていません。

以下のサンプルハッシュをPerlで再帰的に処理することはできません。私は自分のコードも含んでいます。私のハッシュが、私はそれらを避けることができない値1を持つ特定のキーを持っているにバインドされています。ただ、それは明らかであるよう

Can't use string ("1") as a HASH ref while "strict refs" in use at

:それは私に次のエラーを与える

$VAR1 = { 
    'Eukaryota' => { 
     'Rhodophyta'   => {'count' => 5}, 
     'Alveolata'   => {'count' => 16}, 
     'stramenopiles'  => {'count' => 57}, 
     'count'    => 155, 
     'Glaucocystophyceae' => {'count' => 1}, 
     'Cryptophyta'  => {'count' => 18}, 
     'Malawimonadidae' => {'count' => 1}, 
     'Viridiplantae'  => {'count' => 57}, 
    }, 
    'Bacteria' => { 
     'Cyanobacteria'  => {'count' => 1}, 
     'Actinobacteria'  => {'count' => 4}, 
     'count'    => 33, 
     'Proteobacteria'  => {'count' => 25}, 
     'Deinococcus-Thermus' => {'count' => 2}, 
     'Firmicutes'   => {'count' => 1}, 
    }, 
}; 

コードを再帰的にこのハッシュを歩く:

sub analyse_contig_tree_recursively { 
    my $TAXA_TREE = shift @_; 
    my $contig_hash = shift @_; 
    foreach (keys %{$TAXA_TREE}) { 
     print "$_ \n"; 
     analyse_contig_tree_recursively($TAXA_LEVEL->{$_}, $contig_hash); 
    } 
} 

答えて

11

私はあなたが(あなたはどこでもその$contig_hashパラメータを使用していない、とあなたが定義されていない上analyse_contig_tree_recursivelyを呼び出しているかわからないんだけど$TAXA_LEVEL$TAXA_TREEを意味しましたか?)しかし、明らかに、データ構造のレイアウトと再帰的なトラバーサルパターンとの間に不一致があります。あなたのトラバーサル関数は、すべてのエントリがハッシュであると仮定し、空のハッシュを終了ケースとして扱います。keys %{$TAXA_TREE}が空の場合、再帰呼び出しはありません。あなたのデータが与えられたら、値がハッシュであるかどうかをテストする必要があります。値がハッシュでないとわかった場合は再帰しません。

sub analyse_contig_tree_recursively { 
    my $TAXA_TREE   = shift @_; 
    foreach (keys %{$TAXA_TREE}){ 
     print "$_ \n"; 
     if (ref $TAXA_TREE->{$_} eq 'HASH') { 
      analyse_contig_tree_recursively($TAXA_TREE->{$_}); 
     } 
    } 
} 
+4

または 'スカラー::使用率:: reftype($ TAXA_TREE - > {$ _})EQ「HASH''、データ構造は祝福オブジェクトを含む可能性がある場合。 – mob

+0

@ Giles:ありがとう。私のハッシュにはハッシュリファレンスを指していないキーがあり、再帰の終わりを知らせることができます。 $ TAXA_LEVEL、$ contig_hashについて:これらは処理に使用する他の変数の一部です。主な問題は今ではっきりしていて、私のプログラムはうまくいきます...あなたたちは素早く素晴らしいです。一房ありがとう – Abhi

+0

男よ、あなたは速いです。単にあなたの構造を見たいだけで、それを使って何かをする必要がない場合は、[Data :: Dumper](http://perldoc.perl.org/Data/Dumper.html)を使用してください。あなたがハッシュやハッシュのリスト、またはリストのハッシュのリストなどのハッシュになったときに、それはオブジェクト指向プログラミングについて考え始める時です。セットアップに数分かかりますが、後でデバッグの心配をたくさん節約できます。ワンショットでもお勧めです。 –

関連する問題