モジュール

■ モジュールを作ってみる(use, BEGIN, END)

◆ モジュールとは

Perl 5 ではライブラリに加えて モジュール がサポートされました。拡張子は .pm です。下記に簡単なモジュールの例を示します。ライブラリ(*.pl)と同様、use が失敗しないように、最後には 0 以外の値を記述しておきます。

TestMod1.pm
package TestMod1;
BEGIN { print "---BEGIN---\n"; }
sub hello { print "Hello!!\n"; }
sub bye { print "Bye!!\n"; }
END { print "---END---\n"; }
1;

BEGINEND はこのモジュールが呼び出されるときと破棄されるときに呼び出される固定の名前のサブルーチンです。他に、hello() と bye() の2つのサブルーチンを定義しています。

◆ モジュールの読み込み

ライブラリファイルの読み込みは require を用いますが、モジュールの読み込みには use を用います。拡張子の .pm は通常省略します。

use TestMod1;

TestMod1::hello();
TestMod1::bye();

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

---BEGIN---
Hello!!
Bye!!
---END---

■ モジュール名を省略可能にする(@EXPORT)

◆ モジュール名のエクスポート

hello() や bye() は通常 TestMod::hello() や TestMod::bye() として呼び出さなくてはなりませんが、Exporter モジュールを用いてモジュール内のサブルーチン名を エクスポート することができます。エクスポートされた名前は、TestMod::hello() とせず、単に hello() で呼び出すことが可能になります。

TestMod2.pm
package TestMod2;

BEGIN {
    use Exporter();
    @ISA = qw(Exporter);
    @EXPORT = qw(hello bye);
}
sub hello { print "Hello!!\n"; }
sub bye { print "Bye!!\n"; }
1;

@ISA は自分の親として利用するモジュールのリストを示します。@EXPORT はエクスポートするシンボルのリストを示します。qw(a b) は ("a", "b") と等価です。

◆ エクスポートされた名前の使用

エクスポートされた名前は単に hello() の形式で呼び出すことができます。

use TestMod2;
hello();

■ 要求されたもののみエクスポートする(@EXPORT_OK)

◆ エクスポート可能にしておく

TestMod3:: を書くのは面倒だけど、モジュール間で名前が重複するのも困る、そんな場合、エクスポート可能リストを作成しておくと便利です。@EXPORT_OK は、呼び出し側から要求されたときのみエクスポートするシンボルのリストです。

TestMod3.pm
package TestMod3;

BEGIN {
    use Exporter();
    @ISA = qw(Exporter);
    @EXPORT_OK = qw(hello bye);
}

sub hello { print "Hello!!\n"; }
sub bye { print "Bye!!\n"; }
1;
◆ エクスポート可能なシンボルをインポートする

エクスポートされたものを呼び出し側で取りこむことを インポート(受け入れ) と呼びます。インポートするシンボル名を use 文で指定します。

use TestMod3(hello, bye);
hello();
◆ 呼び出し側の書式規則

どのシンボルをインポートするかの、呼び出し側の規則は次のようになります。

use TestMod3;         # @EXPORT に含まれるものすべてをインポートする
use TestMod3();       # @EXPORT に含まれるものでもインポートしない
use TestMod3(a, b);   # @EXPORT_OK のうち、a と b のみをインポートする
use TestMod3 qw(a b); # TestMod3(a, b) と同じ

■ エクスポートするシンボルをグルーピングする(%EXPORT_TAGS)

◆ エクスポートシンボルのグルーピング

use Math(sin cos tan ...) のようにシンボルをひたすら列挙しなくてもすむように、シンボルをグルーピングすることができます。下記の例では、a1, b1 に T1 というタグ名(グループ名)をつけています。

TestMod4.pm
package TestMod4;

BEGIN {
    use Exporter();
    @ISA = qw(Exporter);
    @EXPORT = qw(a1 a2 a3);
    @EXPORT_OK = qw(b1 b2 b3);
    %EXPORT_TAGS = (
        T1 => [ qw(a1 b1) ],
        T2 => [ qw(a2 b2) ],
        T3 => [ qw(a3 b3) ]);
}
(以下略)

これをインポートする側の例を以下に示します。

use TestMod4 qw(:DEFAULT :T1 b3 !b1);

:DEFAULT は @EXPORT 内のすべてのシンボル(a1, a2, a3)を意味します。:T1 はタグ名 T1 に含まれるシンボル(a1, b1)を意味します。b3 は b3 自身、!b1 は b1 を除くことを意味します。結局、上記の例では、(a1, a2, a3) + (a1, b1) + (b3) - (b1) で、(a1, a2, a3, b3) がインポートされることになります。


Copyright (C) 2002 杜甫々