Perl Hackers Hub

第19回 Acmeで広がるPerlの世界―CPANは愉快なジョークモジュールの宝庫(1)

この記事を読むのに必要な時間:およそ 3 分

さまざまなジョークモジュール

ここでは,初めて実行したときに「これはしてやられた(笑⁠⁠」と筆者が感じたAcmeモジュールを紹介します。

Acme::Tests─⁠─テストする側からテストされる側に

通常,CPANモジュールをインストールするときには同梱のテストを実行すると思います。しかし,このモジュールでは逆にテストが出題されます。

図2のように次々と問題が出題され,全問正解しないとテストにパスできません。

図2 Acme::Testsの実行

$ cpanm --look Acme::Tests
Acme-Tests-0.03.tar.gz が展開されてディレクトリを移動します
$ perl Makefile.PL
$ make test
Who plays on slashdot.org ?
  (1) Cowboy Neal
  (1) Cowboy Neal
  (1) Cowboy Neal
  (1) Cowboy Neal
==> 1
Who Invents Perl ?
  (1) Larry Nelson
  (2) Larry Wall
  (3) Larry King
  (4) Some guy with "Perl" in his name
==> 2
2 + 2 = ?
==> 4
Who writes Acme.pm ?
  (1) acme
  (2) spoon
  (3) ingy
  (4) all of them
==> 1
Verifing your answer...
t/00.simple.t .. 1/?
# Failed test at t/00.simple.t line 18.
# Looks like you failed 1 test of 4.
t/00.simple.t .. Dubious, test returned 1 (wstat 256,
0x100)
Failed 1/4 subtests
テストを自作してみる

すばらしいことに,Acme::Testsを使えば自作のテスト出題モジュールも簡単に作れます。

Acme::Testsをuseして,__DATA__行以降に問題文,選択肢,答え,区切り文字----を加えていくだけですリスト2⁠。

リスト2 自作のテスト出題モジュール(本体)

package MyTests;
use strict;
use Acme::Tests -Base;
our $VERSION = '1.00';

__DATA__
コミックマーケット84 の3 日目は何曜日?
(1) 金曜日
(2) 土曜日
(3) 日曜日
(4) 月曜日
Ans: 4
----

今回,起動スクリプトはAcme::Testsのテストファイルディレクトリに付属のものを使いまわしましたリスト3⁠。ユーザの解答を標準入力から取得し,答えの番号と突き合わせています。proveコマンドで確認してみましょう。

リスト3 自作のテスト出題モジュール(起動スクリプト)

use strict;
use MyTests;
use Test::More;

my $t = MyTests->new;
my (@questions, @answers);

while (my $q = $t->next_question) {
    print STDERR "\b\n$q\n==> ";
    my $ans = <>;
    push @questions,$q;
    push @answers,$ans;
}

print STDERR " 結果は...\n";
for (0..$#questions) {
    ok( $t->is_correct($questions[$_],$answers[$_]) )
}

done_testing;
$ prove t/mytest.t
コミックマーケット84 の3 日目は何曜日?
(1) 金曜日
(2) 土曜日
(3) 日曜日
(4) 月曜日
==>

ちゃんとテストが出題されました。とても楽しいですね!

Acme::Addslashes─⁠─ PHPのあの関数を導入してみる

ところで,PHPにはaddslashesという組込み関数があります。addslashesは'(シングルクォート⁠⁠,"(ダブルクォート⁠⁠,\(バックスラッシュ⁠⁠,NULLの前にエスケープのためにスラッシュを付ける関数です。Perlにはこのような関数はありませんが,Acme::Addslashesを導入すれば「似たようなもの」が手に入ります。

リスト4を実行すると,図3のような結果になりました。なんだかやたらめったらスラッシュが加えられていて,とてもセキュウアァァ……な気がしますね注2⁠。

リスト4 Perlでaddslases?

use 5.012;
use strict;
use Acme::Addslashes qw(addslashes);

my $unsafe_str = "evil code";
my $slashed_str = addslashes( $unsafe_str );

say $slashed_str;

$ perl addslases.pl

図3 Acme::Addslashesの結果

図3 Acme::Addslashesの結果

注2)
文字の上に被るスラッシュはUnicodeのcombining long solidusoverlay(U+0337)を利用しています。ですので実行環境,表示フォントによっては正しく表示されないことがあります。

著者プロフィール

まかまか般若波羅蜜(まかまかはんにゃはらみつ)

日本でも数少ないPerlの同人サークル「どんぞこ楽屋」を主催(メンバーは本人しかいない)。年1回,CPANにリリースされている全てのAcmeモジュールを紹介する「Acme大全」を発行,コミックマーケットや各種PM(Perl Mongerの集まり)にて頒布している。YAPC::AsiaでもスピーカーとしてPerlの自作カードゲームやボードゲームなどの発表をしている。Hachioji.pmによく出没。

Twitter:@maka2_donzoko

email:makamaka.donzoko@gmail.com

url:http://www.donzoko.net/gakuya/