全項目をランダムで一度だけ選択していく

twitter 上で時報代わりに短歌をつぶやく bot を PHP のスクリプトで作っていたんですが、諸般の事情で Perl で作り直すことが必要になり、その途中で試作したものです。ついでに 単純に全体からランダムで1つ選択する作りだったものを、全項目をランダムで一度だけ選択していくようにしてみました(未選択なものの次回以降の選択順序を保持するため、インデックスファイルに永続化させています)。
Perl で作成した bot は、Docker コンテナ化して 2019年1月10日 16時の時報ツイートから、これまでのものと交代して運用しています。

動作は次のようになります。

  • ファイルから短歌の一覧を読み出す
  • インデックスファイルから選択順を読み出す
  • インデックスファイルがない または 空 の場合ランダムな選択順を生成する
  • インデックスファイルの末尾のものからpop(取得&破棄)していく
  • 取得したインデックスの行の短歌を表示する
  • pop の結果、インデックスが空になっていたら次回用にランダムな選択順を生成する
  • 残りの選択順をインデックスファイルに書き出す

Perl のスクリプトは次のとおりです(GitHub Gist を使っています)。このバージョンは、Perl 内部の文字コード表現と外部の文字コードとの間のエンコード・デコード処理について、ファイル入出力については、「use open IO => “:utf8”;」で設定し、ソースコード上のマルチバイト文字、標準出力については、コード内で行っています。utf8 フラグ「use utf8;」を立てた例については、後ほど掲載しておきます。

読み込んでいる testData.txt の中身は、次のものです。

秋の田の かりほの庵の 苫をあらみ 我が衣手は 露にぬれつつ
春過ぎて 夏来にけらし 白妙の 衣ほすてふ 天の香具山
あしびきの 山鳥の尾の しだり尾の ながながし夜を ひとりかも寝む
田子の浦に うちいでてみれば 白妙の 富士の高嶺に 雪は降りつつ
奥山に もみぢふみわけ なく鹿の 声聞く時ぞ 秋はかなしき
鵲の 渡せる橋に 置く霜の 白きを見れば 夜ぞふけにける
天の原 ふりさけ見れば 春日なる 三笠の山に 出でし月かも
わが庵は 都のたつみ しかぞすむ 世をうぢ山と 人はいふなり
花の色は 移りにけりな いたづらに 我身世にふる ながめせしまに
これやこの 行くも帰るも 別れては 知るも知らぬも あふ坂の関

実行すると次のようになります。

1 選択後にインデックスが空になるとき
$ perl seqSelection.pl
秋の田の かりほの庵の 苫をあらみ 我が衣手は 露にぬれつつ
春過ぎて 夏来にけらし 白妙の 衣ほすてふ 天の香具山
あしびきの 山鳥の尾の しだり尾の ながながし夜を ひとりかも寝む
田子の浦に うちいでてみれば 白妙の 富士の高嶺に 雪は降りつつ
奥山に もみぢふみわけ なく鹿の 声聞く時ぞ 秋はかなしき
鵲の 渡せる橋に 置く霜の 白きを見れば 夜ぞふけにける
天の原 ふりさけ見れば 春日なる 三笠の山に 出でし月かも
わが庵は 都のたつみ しかぞすむ 世をうぢ山と 人はいふなり
花の色は 移りにけりな いたづらに 我身世にふる ながめせしまに
これやこの 行くも帰るも 別れては 知るも知らぬも あふ坂の関
index: 2
選択アイテム: あしびきの 山鳥の尾の しだり尾の ながながし夜を ひとりかも寝む
$

2 上記に続いて実行させたとき
$ perl seqSelection.pl
秋の田の かりほの庵の 苫をあらみ 我が衣手は 露にぬれつつ
春過ぎて 夏来にけらし 白妙の 衣ほすてふ 天の香具山
あしびきの 山鳥の尾の しだり尾の ながながし夜を ひとりかも寝む
田子の浦に うちいでてみれば 白妙の 富士の高嶺に 雪は降りつつ
奥山に もみぢふみわけ なく鹿の 声聞く時ぞ 秋はかなしき
鵲の 渡せる橋に 置く霜の 白きを見れば 夜ぞふけにける
天の原 ふりさけ見れば 春日なる 三笠の山に 出でし月かも
わが庵は 都のたつみ しかぞすむ 世をうぢ山と 人はいふなり
花の色は 移りにけりな いたづらに 我身世にふる ながめせしまに
これやこの 行くも帰るも 別れては 知るも知らぬも あふ坂の関
index: 1
index: 0
index: 3
index: 6
index: 5
index: 9
index: 7
index: 2
index: 8
index: 4
選択アイテム: 奥山に もみぢふみわけ なく鹿の 声聞く時ぞ 秋はかなしき
$

utf8 フラグを立てた例は、次のものになります。


1 thought on “全項目をランダムで一度だけ選択していく

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です