2013/02/22

初CPAN登録、猫系PerlモジュールAcme::Nyaa作りました。

Acme::Nyaaという猫系Perlモジュールを作りました。文字列か文字列のリファレンスを渡すと、語尾に「ニャー」が付加されて猫が喋っているっぽくなるあれです。

おなじようなものは沢山あるので、完全なる車輪の再発明ですが、CPANには同じ事をするモジュールがなかったので、CPANモジュール登録の練習と言う事でちゃんと作って公開する事にしました。

もともとは、2010年にYAPC::Asiaへ行って、その熱が冷めないうちにCPAN Authorに俺はなる!って勢いで2011年初頭に、Text::Catって名前で作り出したのですが、CPANでのIDが9文字までとか、どのモジュールを使って公開の準備をすればよいかのとか、名前空間はTextでいいのかとか、よくわからんところが多くて、結局放置してました。今回久々のKansai.pmでLTやる事になったので、最近知ったAcmeモジュールという事で作り直して、公開するに至ったわけです。

cpanm Acme::Nyaa;

githubにリポジトリを置いていますし、CPANにも置いてありますので、どっちからインストールしてもOKです。

まだあまりCPANの事を知らないので、Module::Setupを使ってひな形を作ったのですが、githubのリポジトリにはinc::Module::Installを含んでいないので、git cloneしてインストールする場合は、cpanm Module::Installしておく必要があるみたいです。
% sudo cpanm Acme::Nyaa ⏎

または

% git clone git://github.com/azumakuniyuki/p5-Acme-Nyaa.git ⏎
% cd ./p5-Acme-Nyaa ⏎
% sudo cpanm Module::Install ⏎
% perl Makefile.PL && make test && sudo make install
Perl 5.9.4からコアモジュール入りしたModule::Loadを使っているので、また//(defined-or)演算子も使っているので、5.10.0から動く事にしています。

use Acme::Nyaa;

使い方はuseしてnew()してインスタンスから各メソッドを呼ぶだけです。中で文字コードを調べてUTF8に変換してネコにして、また元の文字コードに戻して返しているので、EUCで突っ込んでもShift-JISで突っ込んでも大丈夫です、たぶん。文字コードが判定できない場合はUTF8として処理します。
use Acme::Nyaa;

my $kijitora = Acme::Nyaa->new;

print $kijitora->cat( \'後は野となれ山となれ' );
# 後は野となれ山となれニャーー!

print $kijitora->neko( \'神と和解せよ' );
# ネコと和解せよ

print $kijitora->nyaa( \'京都' );
# 京都ニャーーー!!

print $kijitora->cat( \'「明日の京都は雪でしょう」「最低気温は-4度です」');
# 「明日の京都は雪でしょう」「マーオ!」「最低気温は-4度です」「マーーーオ!!!」

インスタンスメソッド

cat()

catメソッドは文の末尾に何パターンかあるニャーを追加して猫が喋ってる感じの文章になります。またカギ括弧でくくった会話文を渡すと0.5の確率で猫の喧嘩が割り込みます。引数はリファレンスを渡していますが、文字列をそのまま渡してもOKです。

あと、末尾が「な」である場合は、「な」が「にゃー」になります。「芝生に入るな」が「芝生に入るにゃー」になる、という具合です。

neko()

nekoメソッドはある特定の一般名詞をネコに置換します。ネコと和解する為のメソッドです。

nyaa()

nyaaメソッドは、何パターンかあるニャーをランダムに返します。引数があれば末尾にニャーが付いて、なければニャーだけが返ってきます。

Acme::Nyaa::Ja

日本語の文章末尾にニャーを付けたり、一般名詞をネコに置換する処理はAcme::Nyaa::Jaがやっています。他の言語でも猫が喋っているっぽい表現があれば実装しやすいようにしていますが、今のところ日本語以外知らないので、日本語だけの対応です。

英語ではこういう表現でネコ化するとかあればAcme::Nyaa::Enを実装するかもしれないですので、知っている人居てはったら教えて下さい。

Acme

Acmeモジュールの事を知ったのは、Perl入学式主宰の@__papix__さんが、「Acmeモジュール面白い」「Acme大全買った」と、Acmeについて仰っていたので僕もその存在を知るに至りました。元の名前のText::CatからAcme::Nyaaにするにあたって、Acme::SuddenlyDeath (突然の死) や Acme::AjiFry (アジフライ言語)を、元ネタは知らないのですが、Acmeモジュールのお手本として参考にさせてもらったのでこの場を借りてお礼を申し上げます。

No comments:

Post a Comment