Perl 5 ではライブラリに加えて モジュール がサポートされました。拡張子は .pm です。下記に簡単なモジュールの例を示します。ライブラリ(*.pl)と同様、use が失敗しないように、最後には 0 以外の値を記述しておきます。
package TestMod1; BEGIN { print "---BEGIN---\n"; } sub hello { print "Hello!!\n"; } sub bye { print "Bye!!\n"; } END { print "---END---\n"; } 1;
BEGIN、END はこのモジュールが呼び出されるときと破棄されるときに呼び出される固定の名前のサブルーチンです。他に、hello() と bye() の2つのサブルーチンを定義しています。
ライブラリファイルの読み込みは require を用いますが、モジュールの読み込みには use を用います。拡張子の .pm は通常省略します。
use TestMod1; TestMod1::hello(); TestMod1::bye();
これを実行すると次のようになります。
---BEGIN--- Hello!! Bye!! ---END---
hello() や bye() は通常 TestMod::hello() や TestMod::bye() として呼び出さなくてはなりませんが、Exporter モジュールを用いてモジュール内のサブルーチン名を エクスポート することができます。エクスポートされた名前は、TestMod::hello() とせず、単に hello() で呼び出すことが可能になります。
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();
TestMod3:: を書くのは面倒だけど、モジュール間で名前が重複するのも困る、そんな場合、エクスポート可能リストを作成しておくと便利です。@EXPORT_OK は、呼び出し側から要求されたときのみエクスポートするシンボルのリストです。
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) と同じ
use Math(sin cos tan ...) のようにシンボルをひたすら列挙しなくてもすむように、シンボルをグルーピングすることができます。下記の例では、a1, b1 に T1 というタグ名(グループ名)をつけています。
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) がインポートされることになります。