2011-04-02 87 views
3

我正試圖解析MediaWiki's API輸出與format=yaml。我YAML代碼看起來是這樣的:如何迭代嵌套數據結構中的數組?

use YAML qw(Dump Bless Load); 
use YAML::LoadURI; 
use YAML::Tag; 
my $yaml_hash = LoadURI($wiki_url); 
my $id = $yaml_hash->{query}->{namespaces}->[0]; 
print $id; 

這是罰款和花花公子,但你怎麼到超過不野蠻的YAML輸出迫使它遍歷?這將是想法,但顯然這是行不通的。

my $id = $yaml_hash->{query}->{namespaces}-[*]->{id} 

這是YAML output的樣子:

--- 
query: 
    namespaces: 
    - 
     id: -2 
     case: first-letter 
     '*': Media 
     canonical: Media 
    - 
     id: -1 
     case: first-letter 
     '*': Special 
     canonical: Special 
    - 
     id: 0 
     case: first-letter 
     '*': 
      content: 
    - 
     id: 1 
     case: first-letter 
     '*': Talk 
     subpages: 
     canonical: Talk 
    - 
     id: 2 
     case: first-letter 
     '*': User 
     subpages: 
     canonical: User 
    - 
     id: 3 
     case: first-letter 
     '*': User talk 
     subpages: 
     canonical: User talk 

回答

4

這是你想要的嗎?注:我沒有測試它:

目標:東西 「$yaml_hash->{query}->{namespaces}-[*]->{id} - 除了功能

試試這個:

my @ids = map { $_->{id} } @{$yaml_hash->{query}->{namespaces}} ; 

然而,一個for循環可能更清晰的很多人。

my @ids; 
foreach my $ns (@{$yaml_hash->{query}->{namespaces}}){ push @ids, $ns->{id} } 

注意我對一般的Perl數據結構知識出發,沒有什麼具體的YAML。

假設'查詢'和'命名空間'是文字;如果這些是參數,那麼你需要用附加的for-in或while循環蠻力。要對散列進行迭代,請在perldoc perlfunc中查找keys()each()

+0

地圖功能像冠軍一樣工作,感謝您的快速響應! – kSiR 2011-04-02 22:19:55

+0

太棒了,祝你好運! – Paul 2011-04-02 22:22:53

+0

因此,只有在perl上進一步完善我自己的教育,是地圖函數提供$ _給缺乏更好的術語「內部循環」的內部地圖基於id值是從 - > {query} - > {命名空間}? – kSiR 2011-04-02 22:32:09