今度はRaku(Perl6)でDMM Webサービスを叩いてメロディー・雛・マークスを出す。
HTTP::UserAgent
を使うとPerl 5におけるLWP::UserAgent
とほぼ同じインターフェースなので、
あっさりと書けた。JSONのデコードにはJSON::Tiny
を使った。
ただ引っかかったところが2点。コマンドライン引数を取得する際、 Perl 5だと
my $name = $ARGV[0];
で取ってたのが、Rakuだと
my $name = @*ARGS[0];
となる。もう一つは、JSONをdecodeして$data
に入れた
値の中から女優のリストを取ってくるのに、Perl 5だと
@{$data->{result}{actress}}
とハッシュの中身をたどって
デリファレンスしていたが、今回の場合
my $stars = $data->{'result'}{'actress'};
for $stars.list -> $star {
}
と書いた。$stars
はスカラの変数でそこにArray
型が入っているので、
list
メソッドでイテレーブルにしている。
Array
、Scalar
、さらにList
については以下のドキュメントを参考にする。
とはいえ
my $stars = $data->{'result'}{'actress'};
for @$stars -> $star {
}
でもいける。
さて、以下コード。
use HTTP::UserAgent;
use URI;
use JSON::Tiny;
constant $api_id = 'YOUR_API_ID';
constant $affiliate_id = 'YOUR_AFFILIATE_ID';
# @*ARGSで引数取得、Perl5では$ARGV[0]だった
my $name = @*ARGS[0] || '雛';
my $uri = URI.new('https://api.dmm.com/affiliate/v3/ActressSearch');
# クエリを組み立てるハッシュ
my %params =
api_id => $api_id,
affiliate_id => $affiliate_id,
keyword => $name,
hits => 50;
# query-formメソッドに食わせる
$uri.query.query-form(%params);
# say $uri;
# => https://api.dmm.com/affiliate/v3/ActressSearch?api_id=YOUR_API_ID&hits=50&keyword=&affiliate_id=YOUR_AFFILIATE_ID
my $ua = HTTP::UserAgent.new;
my $res = $ua.get($uri);
# status codeが200番台でなければdie
if !$res.is-success {
die $res;
}
# JSON::Tinyからエキスポートされたfrom-jsonメソッドでdecode
my $data = from-json($res.decoded-content);
# ハッシュから女優一覧を取り出す
my $stars = $data{'result'}{'actress'};
# .listしてイテレーション
for $stars.list -> $star {
say $star{'name'};
}
Raku楽しい。