Perl 5 では、パッケージの概念は、モジュールの概念に拡張されました。モジュー ルは同じ名前のライブラリファイルで定義されたパッケージで、再利用可能なよ うに設計されたものです。そのモジュールを使用する、任意のパッケージのシン ボルテーブルに、自分のシンボルのいくつかをエクスポートする機能を用意する ことでこれを行なっているともいえます。あるいは、モジュールはクラス定義と して機能することもでき、明示的にシンボルをエキスポートしなくても、クラス やそのオブジェクトに対するメソッド呼び出しを通して、暗黙のうちに意味が通 じるようにすることができます。
Perl のモジュールは、
use Module;
か、あるいは
use Module LIST;
としてインクルードします。これは、
BEGIN { require "Module.pm"; import Module; }
か、あるいは
BEGIN { require "Module.pm"; import Module LIST; }
とするのと、全く同じことです。
Perl のモジュールはすべて `.pm' という拡張子を持ち、use
は、
これをデフォルトにしていますので、クォートで括って、"Module.pm"と書く必
要はありません。これはまた、新しいモジュールと古い`.pl' ファイルや
`.ph' ファイルとに差を設けるのにも役立っています。モジュール名は、
プラグマとして働くもの以外は、先頭を大文字にします。「プラグマ」は、コン
パイラディレクティブであり、「プラグマ的モジュール」(あるいは、古典学者
であれば「プラグマタ」) と呼ぶ人もあります。
use
文は、BEGIN ブロックを使っていますので、内容のインポートは、
use
文がコンパイルされるとき、ファイルの残りがコンパイルされる前
に行なわれます。それで、モジュールがプラグマとして機能することができ、ま
た、現在のファイルの残りの部分でリスト演算子として参照することのできるサ
ブルーティンの宣言ができるのです。これは、use
の代わりに
require
を使ったのでは、うまく働きません。したがって、名前空間を
変更するモジュールを作ろうとしているのであれば、use
を使い、さも
なくば require
を使います。そうしないと、以下のような問題が起こり
ます:
require Cwd; # Cwd:: を使えるようにする $here = Cwd::getcwd(); use Cwd; # Cwd:: から名前をインポート $here = getcwd(); require Cwd; # Cwd:: を使えるようにするが $here = getcwd(); # main::getcwd() がない
Perl のパッケージは、他のパッケージ名の中にネストすることができますから、 `::' を含むパッケージ名を使えます。しかし、そのパッケージ名を直接、 ファイル名として使うと、役に立たないものになるか、システムによってはファ イル名として使えません。そこで、`Text::Soundex' といったモジュール 名であれば、その定義は、実際には `Text/Soundex.pm' というライブラリ ファイルに置かれます。
Perl のモジュールは常に `.pm' ファイルを持っていますが、そのモジュー
ルに対応して、動的にリンクされる実行ファイルや、自動ロードサブルーティン
定義が存在する場合があります。そうなら、それらは、モジュールのユーザにも
完全に透過的に見えます。追加機能をロードする (あるいは、自動ロードの準備
をする) のは`.pm' ファイルの責任となります。`POSIX' モジュール
は、たまたま、動的ロードも自動ロードも行ないますが、使う側は、すべてを使
えるようにするために use POSIX
と書くことができるだけです。
拡張モジュールの記述に関してさらに詳しくは、 See section 応用プログラムインタフェース,やSee section 拡張を行なうための内部関数,を 参照してください。
C++ や Ada や Modula-17 といった言語で行なわれているような、プライベート 部とパブリック部を分けるといったことは、Perl では行なっていません。Perl は、強制されたプライバシーなどには興味がありせん。招かれたわけではないか ら、リビングに入らない方がよいのであって、ショットガンがあるから入らない 方がよいのではありません。
モジュールとそのユーザの間には契約があります。一部は、非成文慣習法的なも
のであり、一部は「成文化」されたものです。慣習契約には、モジュールは頼ま
れない限り名前空間を汚さない、ということがあります。モジュールの成文化契
約 (AKA ドキュメント) は、別の規約を作るかもしれません。しかし、
use RedefineTheWorld
して、世界を再定義することで、結果を甘受する
のです。
Go to the first, previous, next, last section, table of contents.