Как перебрать массив во вложенной структуре данных? - PullRequest
3 голосов
/ 03 апреля 2011

Я пытаюсь проанализировать вывод API MediaWiki с помощью 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

1 Ответ

4 голосов
/ 03 апреля 2011

Это то, что вы хотите? Примечание: я не проверял это:

Цель: что-то " Как " $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 ' и ' namespace * ' являются литералами; если это параметры, то вам нужно использовать грубые форсировки с дополнительными циклами for-in или while. Для перебора хешей ищите keys() и each() in perldoc perlfunc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...