PERLMOD(1) USER COMMANDS PERLMOD(1)
NAME
perlmod - Perl のモジュール (パッケージ)
DESCRIPTION
パッケージ
Perl には、パッケージどうしがお互いの変数を踏みにじることが
無いように、名前空間を別ける機構が用意されています。 デフォ
ルトでは、Perl スクリプトは main と言われるパッケージで、コ
ンパイルを始めます。 名前空間を切り替えるには、package 宣言
を使います。 package 宣言のスコープは、その宣言の場所から、
囲っているブロックの終わりまでです (local() 演算子と同じスコ
ープです)。 require 演算子でインクルードされるファイルの、
最初の宣言となるのが普通です。 複数の場所で、同一のパッケー
ジに切り替えることもできます。 この宣言は、ブロックの残りの
部分で、コンパイラがどのシンボルテーブルを使うのかに影響を与
えるだけです。 他のパッケージの変数やファイルハンドルは、識
別子名の前に、$Package::Variable のようにパッケージ名とコロ
ン 2 つで「修飾」することで、参照することができます。 パッ
ケージ名が空の場合には、main パッケージを参照しているものと
みなされます。 つまり、$::sail は、$main::sail と同じです。
(以前はパッケージの区切文字にシングルクォートを使っていまし
たが、現在はダブルコロンが使われます。 人間が読みやすいから
であり、emacs マクロが読みやすいからです。 また、C++ のプロ
グラマが、何が起こっているかを理解しやすいということもありま
す。)
パッケージは、$OUTER::INNER::var のように、別のパッケージの
中にネストすることもできます。 しかし、これが名前の検索順序
に関るものではありません。 すべてのシンボルは、その時点のパ
ッケージにローカルであるか、完全な形でパッケージ名をつけて、
外部のパッケージから導入したものでなければなりません。 たと
えば、パッケージ OUTER にいるとすると、$INNER::var という表
現は、$OUTER::INNER::var を参照します。 パッケージ INNER は、
まったく独立したグローバルなパッケージとして扱われます。
英字 (または、下線) で始まる識別子のみが、各々のパッケージの
シンボルテーブルに蓄えることができます。 他のすべてのシンボ
ルは、パッケージ main に置かれます。 さらに、識別子 STDIN、
STDOUT、STDERR、ARGV、ARGVOUT、ENV、INC、SIG は、組み込みの
用法とは異なることに使っても、強制的にパッケージ main に置か
れます。 また、m、s、y というパッケージを作った場合には、パ
ッケージ名で修飾した形で識別子を使うことができない場合があり
ます。 それぞれ、パターンマッチ、置換、変換と解釈されるから
です。
(以前は下線で始まる変数は、強制的に main パッケージに置かれ
ましたが、プライベートな変数やメソッドを表わすのに、先頭に下
線を使うことができた方が良いと判断しました。)
Perl manpages Last change: Release 5.0 Patchlevel 00 1
PERLMOD(1) USER COMMANDS PERLMOD(1)
eval() された文字列は、eval() がコンパイルされたパッケージで、
コンパイルされます。 (しかし、$SIG{} への代入は、指定したシ
グナルハンドラが、パッケージ main にあるものとして扱います。
シグナルハンドラを別のパッケージにおきたい場合には、そのシグ
ナルハンドラ名にパッケージ名を付けてください。) たとえば、
Perl ライブラリの perl5db.pl を参照してください。 最初に、
デバッグしようとするスクリプトの変数を、デバッガが壊さないよ
うに、パッケージ DB に切り替えます。 しかし、多くのポイント
で、さまざまな式をパッケージ main (や、もともと指定してたパ
ッケージ) で評価するために、一時的にパッケージ main に戻るよ
うにしています。 perldebug manpage を参照してください。
シンボルテーブル
パッケージのシンボルテーブルは、パッケージ名に 2 つのコロン
を付けた名前の連想配列に蓄えられます。 つまり、main のシン
ボルテーブルは、%main::、または短く %:: となります。 同様に、
先に述べたネストしたパッケージは %OUTER::INNER:: となります。
連想配列の個々のエントリの value は、*name 記法を使ったとき
に参照するものです。 実際、
local(*main::foo) = *main::bar;
local($main::{'foo'}) = $main::{'bar'};
は、前者がシンボルテーブルの検索をコンパイル時に行ないますの
で、より効率的ですが、同じことを行ないます。
たとえば、これを使って、パッケージ内のすべての変数を出力する
ことができます。
以下は、Perl ライブラリの dumpvar.pl です:
package dumpvar;
sub main::dumpvar {
($package) = @_;
local(*stab) = eval("*${package}::");
while (($key,$val) = each(%stab)) {
local(*entry) = $val;
if (defined $entry) {
print "\$$key = '$entry'\n";
}
if (defined @entry) {
print "\@$key = (\n";
foreach $num ($[ .. $#entry) {
print " $num\t'",$entry[$num],"'\n";
}
print ")\n";
}
Perl manpages Last change: Release 5.0 Patchlevel 00 2
PERLMOD(1) USER COMMANDS PERLMOD(1)
if ($key ne "${package}::" && defined %entry) {
print "\%$key = (\n";
foreach $key (sort keys(%entry)) {
print " $key\t'",$entry{$key},"'\n";
}
print ")\n";
}
}
}
このサブルーティンは、パッケージ dumpvar でコンパイルされて
いるにも関らず、サブルーティンの名前が修飾されているため、パ
ッケージ main の中に入れられることになります。
シンボルテーブルエントリへの代入は、別名付け操作になります。
つまり、
*dick = *richard;
は、richard という名前でアクセスできる変数、サブルーティン、
ファイルハンドルを dick という名前でもアクセスできるようにし
ます。 リファレンスを使えば、特定の変数だけ、サブルーティン
だけ、というように個別に別名を付けることができます:
*dick = \$richard;
は、$richard と $dick を同じ変数にしますが、@richard と @dick
は別の配列のままです。 難しいですか。
パッケージのコンストラクタとデストラクタ
パッケージのコンストラクタとデストラクタとして機能する、2 つ
の特別なサブルーティン定義があります。 それは、BEGIN ルーテ
ィンと END ルーティンです。 このルーティンでは sub は省略で
きます。
BEGIN サブルーティンは、できるだけ早く、つまり、たとえファイ
ルの残りが解析されていなくても、定義された瞬間に実行されます。
ファイル内に複数の BEGIN ブロックを置くこともでき、定義され
た順番に実行されます。 BEGIN ブロックは即座に実行されるため、
サブルーティンなどの定義を他のファイルから読み込んで、ファイ
ルの残りの部分から見えるようにすることができます。
END サブルーティンは、できるだけ遅く、つまり、たとえ die()
関数の結果であっても、インタプリタが終了するときに実行されま
す。 (しかし、シグナルによって決壊してしまう時には実行され
ません。 (できるものなら、) 自分でトラップしなければなりま
せん。) ファイル内に複数の END ブロックを置くこともでき、定
義とは逆の順序で実行されます。 つまり、ラストインファースト
アウト (LIFO) ということです。
Perl manpages Last change: Release 5.0 Patchlevel 00 3
PERLMOD(1) USER COMMANDS PERLMOD(1)
Perl に -n や -p スイッチを使ったときには、 BEGIN と END は、
縮退したケースとして、awk と同じように動作します。
Perl のクラス
Perl 5 には、特別なクラスのための構文はありませんが、メソッ
ドとして機能するサブルーティンを持つパッケージは、クラスとし
て機能することができます。 そのようなパッケージでは、他のク
ラスパッケージの名前を配列 @ISA に並べることで、そのクラスか
らメソッドのいくつかを引き込んでくることができます。 このこ
とについて詳しくは、perlobj manpage を参照してください。
Perl のモジュール
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 ファイルとに差を設けるのにも役立っていま
す。 モジュール名は、プラグマとして働くもの以外は、先頭を大
文字にします。 「プラグマ」は、コンパイラディレクティブであ
Perl manpages Last change: Release 5.0 Patchlevel 00 4
PERLMOD(1) USER COMMANDS PERLMOD(1)
り、「プラグマ的モジュール」(あるいは、古典学者であれば「プ
ラグマタ」) と呼ぶ人もあります。
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 と書くことができるだけです。
拡張モジュールの記述に関してさらに詳しくは、perlapi manpage
や perlguts manpage を参照してください。
NOTE
C++ や Ada や Modula-17 といった言語で行なわれているような、
プライベート部とパブリック部を分けるといったことは、Perl で
は行なっていません。 Perl は、強制されたプライバシーなどに
は興味がありせん。 招かれたわけではないから、リビングに入ら
ない方がよいのであって、ショットガンがあるから入らない方がよ
いのではありません。
モジュールとそのユーザの間には契約があります。 一部は、非成
Perl manpages Last change: Release 5.0 Patchlevel 00 5
PERLMOD(1) USER COMMANDS PERLMOD(1)
文慣習法的なものであり、一部は「成文化」されたものです。 慣
習契約には、モジュールは頼まれない限り名前空間を汚さない、と
いうことがあります。 モジュールの成文化契約 (AKA ドキュメン
ト) は、別の規約を作るかもしれません。 しかし、
use RedefineTheWorld して、世界を再定義することで、結果を甘
受するのです。
THE PERL MODULE LIBRARY
Perl の配布には、多くのモジュールが含まれています。 これら
については、以下に記述しており、すべて .pm で終わるようにな
っています。 ライブラリディレクトリには、 .pl や .ph で終わ
るファイルがあることも発見するかもしれません。 これらの古い
ライブラリが提供されていますので、これを使う古いプログラムも
実行できます。 h2ph で作られた .ph ファイルは、h2xs で作ら
れる拡張モジュールとなるかもしれません。 (いくつかの .ph の
値は既に、POSIX モジュールで使用できるかもしれません。) 配
布の中の pl2pm ファイルは、変換の手助けになるかもしれません
が、機械的な処理でしかないので、「何でもこい」というものでは
ありません。
プラグマ的モジュール
これらは、プラグマのようにして動作し、プログラムのコンパイル
に影響を与えるもので、通常 use や no といっしょに使ったとき
に正常に動作します。 ローカルなスコープが存在しますから、内
側の BLOCK で
no integer;
no strict 'refs';
として、撤回すれば、その BLOCK の最後までが影響されます。
以下のプログラムが定義され (て、独自のドキュメントを持っ) て
います。
integer double の代わりに整数で演算を行なう Perl プラグ
マ
less コンパイラからのリソースを少なく要求するプラグマ
sigtrap 不慮のシグナルで、スタックのバックとレースを許可
する Perl プラグマ
strict 安全でない構文を制限する Perl プラグマ
subs sub 名を、あらかじめ定義する Perl プラグマ
Perl manpages Last change: Release 5.0 Patchlevel 00 6
PERLMOD(1) USER COMMANDS PERLMOD(1)
標準モジュール
以下のもっジュールはすべて、Exporter モジュールを使用してい
るので、名前空間の汚染に関してうまいやり方で動作することが、
期待されます。 詳しくは、各々のドキュメントを参照してくださ
い。
Abbrev リストから省略形一覧を作成する
AnyDBM_File 複数の DBM ファイルを扱う枠組みを与える
AutoLoader 要求時にのみ関数をロードする
AutoSplit 自動ロードのためにパッケージを分割する
Basename ファイル記述から、ファイル名とパス名を解析する
Benchmark コードの実行時ベンチマークを行なう
Carp (呼び元の観点からの) エラーの warn と die
CheckTree トリー上で多くのファイルテストチェックを行なう
Collate その時点の locale にしたがって、8-bit スカラデー
タを比較する
Config Perl の config オプションをアクセスする
Cwd カレントディレクトリのパス名を取得する
DynaLoader C ライブラリを Perl のコードに動的ロードする
English 醜い記号のような変数名の代わりに、うまい英語 (あ
るいは awk) の名前を使う
Env 環境変数をインポートする Perl モジュール
Exporter 名前空間操作を制御するモジュール
Fcntl C の fcntl.h 定義をロードする
FileHandle ファイルハンドルに対し、オブジェクトメソッドを提
供する
Find ファイルトリーのトラバースする
Finddepth ディレクトリ構造を、深度優先でトラバースする
Getopt getopt(3) 処理の基本的なものと拡張されたもの
MakeMaker Perl 拡張モジュールの Makefile を生成する
Perl manpages Last change: Release 5.0 Patchlevel 00 7
PERLMOD(1) USER COMMANDS PERLMOD(1)
Open2 読み書き両用のプロセスをオープンする
Open3 読み書き、エラー処理のためのプロセスをオープンす
る
POSIX IEEE 1003.1 名前空間への Perl インタフェース
Ping ホストの起動状態を確認する
Socket C の socket.h 定義をロードする
拡張モジュール
拡張モジュールは、C (あるいは、Perl と C の混成) で書かれ、
それが必要になることがあれば、動的にロードされるものです。
サポートされている拡張モジュールには Socket モジュール、
Fcntl モジュール、POSIX モジュールが含まれます。
以下は、一般的な C の拡張モジュールで、Perl 5.0 のリリース時
に利用可能ですが、大きさの問題や、変更が多いなどの理由や、単
純に適切なテストや、Perl がベータテストされた多くの環境での
構築の時間がとれなかったために (少なくとも完全には) バンドル
されていません。 現状や場所を尋ねてランダムに投稿する前に、
archie(1L) や Perl FAQ、Meta-FAQ、WWW page、あるいは作者自身
に頼って、探すことをお勧めします。 出力以降に、以下の名前や
アドレスが変わっていないという保証はありませんし、事実変わっ
ています。
Curses William Setzer <William_Setzer@ncsu.edu> が書い
たもので、標準の配布には含まれませんが、この拡張
モジュールは、多くのシステムに移植されています。
お近くの Perl アーカイブサイトか、
ftp://ftp.ncsu.edu/pub/math/wsetzer/cursperl5??.tar.gz
から FTP してください。 これは、現在アルファテ
スト中ですので、名前や ftp の場所は変わるかもし
れません。
DBI <Tim.Bunce@ig.co.uk> が書いたポータブルなデータ
ベースインタフェースです。 これは、perl4 になさ
れた、多くのデータベースを扱うための移植に置き変
わるものです。 DBperl 拡張の正規のアーカイブは、
ftp.demon.co.uk:/pub/perl/db です。 このアーカ
イブには、rdb、shql といった non-SQL システムは
もとより、Ingres、Oracle、Sybase、Informix、Unify、
Postgres、Interbase のための perl4 の移植が含ま
れています。
Perl manpages Last change: Release 5.0 Patchlevel 00 8
PERLMOD(1) USER COMMANDS PERLMOD(1)
DB_File DBM との組み合わせで最も速く、制限が最も少ない、
この拡張モジュールは、ハッシュに tie() するため
に、一般的なバークレイ DB を使います。 これには、
標準的に配布される man page や動的ロード拡張モジ
ュールが含まれていますが、バークレイのコードは、
自分で入手する必要があります。 どこにあるかにつ
いては、DB_File manapge を参照してください。
Sx この拡張モジュールは、Perl GUI プログラミングの
ための Athena と Xlib のフロントエンドとなるもの
で、Dominic Giampaolo <dbg@sgi.com> が書いたもの
を Frederic Chauveau <fmc@pasteur.fr> が Sx のた
めに書き直しました。 これは、
ftp.pasteur.fr:/pub/Perl/Sx.tar.gz
から FTP することができます。
Tk この拡張モジュールは、広く使われている tcl/tk
X11 パッケージと組み合わせる、オブジェクト指向の
Perl5 です。 しかし、これを使うために TCL の知
識はいりません。 これは、Malcolm Beattie
<mbeattie@sable.ox.ac.uk> が書いたもので、archie
(1L) などのツールを使っても、どこにあるかがわか
らなければ、上にあげた Malcolm のマシンの
/private/Tk-october.tar.gz から入手することがで
きます。
Perl manpages Last change: Release 5.0 Patchlevel 00 9