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 スイッチを使ったときには、 BEGINEND は、
     縮退したケースとして、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 ファイルは、変換の手助けになるかもしれません
     が、機械的な処理でしかないので、「何でもこい」というものでは
     ありません。


     プラグマ的モジュール

     これらは、プラグマのようにして動作し、プログラムのコンパイル
     に影響を与えるもので、通常 useno といっしょに使ったとき
     に正常に動作します。 ローカルなスコープが存在しますから、内
     側の 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        (呼び元の観点からの) エラーの warndie


     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