3

我正在尝试使用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 输出的样子:

---
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

1 回答 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 中

于 2011-04-02T22:15:11.807 回答