Go to the first, previous, next, last section, table of contents.


パッケージ

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' パッケージに置かれました が、プライベートな変数やメソッドを表わすのに、先頭に下線を使うことができ た方が良いと判断しました。)

eval() された文字列は、eval() がコンパイルされたパッケージ で、コンパイルされます。(しかし、$SIG{} への代入は、指定したシグ ナルハンドラが、パッケージ `main' にあるものとして扱います。シグナ ルハンドラを別のパッケージにおきたい場合には、そのシグナルハンドラ名にパッ ケージ名を付けてください。)たとえば、Perl ライブラリの `perl5db.pl' を参照してください。最初に、デバッグしようとするスクリプトの変数を、デバッ ガが壊さないように、パッケージ `DB' に切り替えます。しかし、多くの ポイントで、さまざまな式をパッケージ `main' (や、もともと指定してた パッケージ) で評価するために、一時的にパッケージ `main' に戻るよう にしています。See section デバッグ,を参照してください。


Go to the first, previous, next, last section, table of contents.

検索式: