こんばんは
Perl 6 Advent Calendar 2015の3日目です1
Perl5の名著 「Perl Cookbook」 のコードをPerl6で書いたらどんな感じになるのかなぁという企画で、今回は20.1. Fetching a URL from a Perl Script (Perlスクリプトで、あるURLの内容を取得する) です。2
※ Perl6のソースコードQiitaに貼る時はrb
(Ruby)を指定しています。3
Perl5版
とあるURLのデータを取ってきて表示します。
前述の20.1. Fetching a URL from a Perl Scriptのコードを少しだけ変えたものです。
use v5.18;
use strict;
use LWP::Simple;
say $LWP::Simple::VERSION; #=> 6.00
my $URL = 'http://www3.nhk.or.jp/rss/news/cat2.xml';
my $content;
unless ( defined ( $content = get $URL )){
die "could not get $URL\n";
}
say $content;
Perl6版
Perl6版のLWP::Simpleモジュールを使います。( まだモジュールのバージョン番号が若いですね )
use v6;
use LWP::Simple;
$LWP::Simple::VERSION.say; #=> 0.090
my $URL = 'http://www3.nhk.or.jp/rss/news/cat2.xml';
my $content = LWP::Simple.get( $URL ) or die "could not get $URL\n";
if $content ~~ Buf {
$*OUT.write($content);
}
elsif $content ~~ Str {
$content.say;
}
Buf
(Blob)でデータが返ってくると扱いづらい気がするので、Str
に変換するようにしてみます。
use v6;
use LWP::Simple;
my constant @urls = <
http://www3.nhk.or.jp/rss/news/cat2.xml
http://www.jma-net.go.jp/rss/jma.rss
http://headlines.yahoo.co.jp/rss/zdn_mkt-dom.xml
>;
for @urls -> $url {
$url.say;
# 返ってくるのが Buf だったら、decodeメソッドで Str に変換する。
if ( my $content = LWP::Simple.get( $url ) ) ~~ Buf {
$content .= decode;
}
# $content の型を確認
# $content.WHAT.say; #=> (Str)
# $content の中に「description」という文字列はあるかな?
# $content.match(/:i description/).say;
# 取得したHTMLを出力
$content.say;
}
おわりです。