天然パーマです。

Rakuでメロディー・雛・マークスを出す

今度は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メソッドでイテレーブルにしている。

ArrayScalar、さらに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楽しい。