Snippets

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

Updated by sironekotoro

File random_poem_v2.pl Modified

  • Ignore whitespace
  • Hide word diff
     die 'split fail!';
 }
 
-# ランダム生成された川柳を10首ほど表示する
+# ランダム生成された川柳を10句表示する
 for ( 1 .. 10 ) {
     my $random_senryu = join ' ',
         (
Created by sironekotoro

File random_poem_v2.pl Added

  • Ignore whitespace
  • Hide word diff
+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;
+}
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.