2017-08-11 2 views
1

私はMediaWiki APIを使って特定のWikipediaタイトルからすべてのリダイレクトを取得しようとしていますが、私はほとんどそこにいると思いますが、ハッシュと配列の複雑なデータ構造に迷うことがあります。PerlでMediaWiki :: APIからリダイレクトタイトルのリストを抽出するにはどうすればよいですか?

どのようにしてリダイレクトタイトルのリストを抽出できますか?例では

私は「日本のために照会し、このようになりますリストを取得する必要があります

'JPN',"Land der aufgehenden Sonne","Das Land der aufgehenden 
Sonne","Zipango","\x{65e5}\x{672c}","R\x{ec}b\x{11b}n" 

(サイド質問:なぜ私はすべてのケースのためのUTF-8文字列を取得しない?)

下記のコードは、MediaWiki::APIのドキュメントに適合しています。

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 

問題:redirect-arrayで実際のタイトルを取得するにはどうすればよいですか?

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

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

答えて

2

クエリはハッシュリファレンスを返します。この構造のエントリの1つはを含む別のハッシュリファレンスを指すqueryです。 pagesハッシュリファレンスには、ページIDであるキーが含まれています。これらのそれぞれは、このページがリダイレクトするすべてのページを含む配列への参照であるリダイレクトエントリを含む別のハッシュリファレンスを示します。一緒にすべてのものを置く

#!/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)}; 
    } 
} 

Postfix dereferencingは物事少しクリーナーを行います

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以降が必要です。

+0

'$ r - > {redirects} - > @ *'これで何が起こっているのですか?それは '$ _'のperl6バージョンに似ていますか?それはperlの特定の最小バージョンを必要とするのではないですか? – jmcneirney

関連する問題