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.