如何从Perl中的MediaWiki::API提取重定向标题列表?

如何从Perl中的MediaWiki::API提取重定向标题列表?,perl,mediawiki-api,hash-of-hashes,Perl,Mediawiki Api,Hash Of Hashes,我正在尝试使用MediaWiki API从某个Wikipedia标题获取所有重定向,我想我差不多做到了,但我迷失在哈希和数组的复杂数据结构中 如何提取重定向标题列表 在本例中,我查询“Japan”,应该得到如下列表: 'JPN',"Land der aufgehenden Sonne","Das Land der aufgehenden Sonne","Zipango","\x{65e5}\x{672c}","R\x{ec}b\x{11b}n" (附带问题:为什么我不能在所有情况下都使用UT

我正在尝试使用MediaWiki API从某个Wikipedia标题获取所有重定向,我想我差不多做到了,但我迷失在哈希和数组的复杂数据结构中

如何提取重定向标题列表

在本例中,我查询“Japan”,应该得到如下列表:

'JPN',"Land der aufgehenden Sonne","Das Land der aufgehenden 
Sonne","Zipango","\x{65e5}\x{672c}","R\x{ec}b\x{11b}n"
(附带问题:为什么我不能在所有情况下都使用UTF-8字符串?)

下面的代码改编自文档

use MediaWiki::API;
use warnings;
binmode STDOUT, ':utf8';
use JSON;
use Data::Dumper;

my $LANG="de";

my $mw = MediaWiki::API->new( { api_url => 'https://en.wikipedia.org/w/api.php' }  );
my $mw_LANG = MediaWiki::API->new( { api_url => "https://$LANG.wikipedia.org/w/api.php" }  );

my $wikititle ="Japan";

my $alltitles = $mw_LANG->api( {
 action => 'query',
 titles => $wikititle,
 prop => 'redirects',
 format => 'json',
} )
|| die $mw_LANG->{error}->{code} . ': ' . $mw_LANG->{error}->{details};

#just print to know how the structure looks like
print Dumper($alltitles);

my ($pageid,$langlinks) = each ( %{ $alltitles->{query}->{pages} } );
print "pageid $pageid\n";#yes works:  this prints the page id
问题:如何在
重定向数组中获取实际标题

  my $relinks = $alltitles->{'query'}->{'pages'}->{$pageid}->{'redirects'}; #no does not work!

  foreach my $el ( @{ $relinks->{'title'} } ) {
    print " $el $el->{'*'}\n";
  }

查询返回一个hashref。此结构中的一个条目是
query
,它指向另一个包含
页面的hashref。
pages
hashref包含作为页面ID的键。每一个都指向另一个hashref,该hashref包含一个redirects条目,该条目是对包含此页面重定向到的所有页面的数组的引用

把所有这些放在一起:

#!/usr/bin/env perl

use strict;
use warnings;

use open qw(:std :utf8);

use MediaWiki::API;
use JSON::MaybeXS;
use Data::Dumper;

my $LANG= "de";

my $mw = MediaWiki::API->new( { api_url => 'https://en.wikipedia.org/w/api.php' }  );
my $mw_LANG = MediaWiki::API->new( { api_url => "https://$LANG.wikipedia.org/w/api.php" }  );

my $wikititle ="Japan";

my $alltitles = $mw_LANG->api( {
        action => 'query',
        titles => $wikititle,
        prop => 'redirects',
        format => 'json',
    }
) or die sprintf '%d: %s', @{ $mw_LANG->{error} }{qw(code details)};

for my $pageid ( keys %{ $alltitles->{query}{pages} } ) {
    my $r = $alltitles->{query}{pages}{$pageid};
    printf "Redirects for page %d with title '%s'\n", @{$r}{qw(pageid title)};
    for my $redirect ( @{ $r->{redirects} }) {
        printf "\t%d: '%s'\n", @{$redirect}{qw(pageid title)};
    }
}
让事情变得更干净:

for my $pageid ( keys $alltitles->{query}{pages}->%* ) {
    my $r = $alltitles->{query}{pages}{$pageid};
    printf "Redirects for page %d with title '%s'\n", $r->@{qw(pageid title)};
    for my $redirect ( $r->{redirects}->@* ) {
        printf "\t%d: '%s'\n", $redirect->@{qw(pageid title)};
    }
}

这需要
perl
5.20或更高版本。

$r->{redirects}->@*
这是怎么回事?这与perl6版本的
$\ucode>类似吗?这不需要特定的最低版本的perl吗?