【Perl】標準モジュールツールキットを作ろう(ただしソースフィルタなしで)
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
Perl Advent Calendar 2012を読み漁っていたところ、Syntax::Collectorというモジュールが紹介されていたので、試しに少し使ってみました。以下、簡単にご紹介します。
Perlでいくつかのまとまったモジュールを書く時、複数のモジュールで似たようなuse
文をあちこちに書いてしまうことがよくあります。これは、プログラマーの三大美徳のうちの“怠慢”(Laziness)に反してしまうので、一ヶ所にまとめる必要があります。
ただし、共通するuse
文だけを単に別モジュールに切り出すだけでは不十分で、Modern::Perlがやっているように、自前のimport
サブルーチン等を実装する必要がありますが、少々面倒です。また、もう一つの方法として、Perl Hacks(オライリー・ジャパン)のHack#34にFilter::Macroモジュールを使用したハックが紹介されています。これは、最小限のコーディングで済むのが魅力的ですが、ソースフィルタを使っているのが残念な点です。
ここで冒頭の話題に戻りますが、Syntax::Collectorというモジュールを使用することで、ソースフィルタを使わず、かつ最小限のコーディングで、これを実現することができます。以下はこのモジュールを使用したコードの例です。
1 2 3 4 5 6 7 8 9 10 11 12 |
●MyApp/Syntax.pm package MyApp::Syntax; use 5.010; use Syntax::Collector -collect => <<enough; use strict 0 ; use warnings 0 ; use feature 0 qw/say/; enough 1; __END__ |
ハッシュキー-collect
の値に、何度も書きたくないuse
文をまとめて記述します。このモジュールを使用する側は、MyApp::Syntax
をuse
するだけで、strict
、warnings
及びfeature
の3つのプラグマをまとめて使用することができます(もちろん、レキシカルスコープの範囲内で作用します)。以下は、上記のモジュールのテストスクリプト及びその実行例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
●test.pl use MyApp::Syntax; use Test::More; use Test::Output; use Test::Warn; stdout_is { say "hello"; } "hello\n"; warning_like { stdout_is { my $num; say $num; } "\n"; } qr/^Use of uninitialized value/; # Uncommenting next line causes compile error # $global_variable_without_package_name = 42; done_testing; __END__ ●テスト実行例 $ perl test.pl ok 1 ok 2 ok 3 1..3 |
テストコードでは、(MyApp::Syntax
にバンドルされた)warnings
及びfeature
プラグマが有効になっていることが確認できます。なお、strict
プラグマについては、パッケージ名で修飾されていないグローバル変数の行のコメントアウトを解除することで、その効果を確認することができます(すなわち、コンパイルエラーになります)。
以上、簡単ですがPerlに関するトピックをご紹介しました。