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