Snippets

sironekotoro 川柳をランダムに生成する(Webからとってきて10句ほど表示版)

Created by sironekotoro last modified
use strict;
use warnings;

use Encode qw/encode decode/;    # 日本語入力・出力する時に利用
use HTTP::Tiny qw/new get/;    # Webから情報を取ってくる時に利用

# 第31回サラリーマン川柳 ベスト11-100|サラリーマン川柳|第一生命保険株式会社
my $url
    = 'https://event.dai-ichi-life.co.jp/company/senryu/archive/31-11-100.html';

# Webから情報を取ってくる
my $res = HTTP::Tiny->new()->get($url)->{content};
$res = decode( 'utf8', $res );

# 川柳の部分を正規表現を使って取得する
my @poem = $res =~ m|span class="rank">\d+</span>(.+)<span class="name2"|g;

# ルビを削除するサブルーチンを通す
@poem = delete_ruby(@poem);

# 川柳を3つの配列に分割する
my ( @kami, @naka, @simo );
for my $poem (@poem) {
    my ( $kami, $naka, $simo ) = split /\s+/, $poem;
    push @kami, $kami;
    push @naka, $naka;
    push @simo, $simo;
}

# 上の句、中の句、下の句の数が異なっている場合には分割失敗で
# プログラムを止める
if ( scalar @kami != scalar @naka && scalar @naka != scalar @simo ) {
    die 'split fail!';
}

# ランダム生成された川柳を10句表示する
for ( 1 .. 10 ) {
    my $random_senryu = join ' ',
        (
        $kami[ rand($#kami) ],
        $naka[ rand($#naka) ],
        $simo[ rand($#simo) ]
        );
    print encode( 'utf8', $random_senryu ) , "\n";
}

# ルビを削除するサブルーチン
sub delete_ruby {
    my @poem = @_;
    my @return_poem;

 # ルビがふってある川柳については、ルビ部分を削除する
    for my $poem (@poem) {
        if ( $poem =~ /ruby/ ) {

            # ルビのカッコ部を削除
            $poem =~ s/(.+)//g;

            # ルビのタグ部を削除
            $poem =~ s/<.+?>//g;

        }
        push @return_poem, $poem;
    }
    return @return_poem;
}

Comments (0)