如何在嵌套数据结构中迭代数组?

3

我正在尝试使用format=yaml解析MediaWiki的API输出。我的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输出的样子:
---
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
1个回答

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特定的内容。

假设'query'和'namespaces'是字面量;如果它们是参数,则需要使用额外的for-in或while循环来强制执行。要遍历哈希表,请查阅keys()each()perldoc perlfunc中。


map函数像冠军一样运行良好,感谢您的快速响应! - kSiR
为了进一步自我学习Perl,map函数是否根据->{query}->{namespaces}中的id值向内部循环提供$_? - kSiR
非常感谢您的解释,我通常使用Perl进行系统管理,并不经常涉及一些高级Perl结构。当需要通过数字位与哈希表中列出的数组进行交互时,我有点迷失了方向,而且YAML文档有时候...难以理解。再次感谢您的帮助。 - kSiR
1
Perl中的每个循环都没有一个$_循环变量。只有foreach循环和while循环的特殊情况具有隐式的$_变量。对于for(;;)循环,没有隐式的循环变量。 - tadmc
@Brad 谢谢。这是一个风格问题,取决于谁阅读你的代码。 - Paul
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接