問題の歴史:
Perlでは、名前空間はプログラムの異なる部分間で変数や関数を隔離するための主要な手段です。packageディレクティブを使用することで、独立した領域が作成され、それぞれが独自のグローバル変数と関数のセットを持ちます。これにより、名前の競合なしで複数ファイルプロジェクトを開発することができます。
問題:
スコープの誤った取り扱い、レキシカル変数とパッケージ変数の混合、または"main"名前空間の誤った使用は、予期しない変数の出現、関数の上書き、税やテストにおける不明瞭なバグを引き起こすことがよくあります。
解決策:
package SomeName;を使用して自分の名前空間を宣言します。my)はブロック内でのみ見え、グローバル変数(our、以前のuse vars)はパッケージ全体で見えます。AnotherPackage::some_function()。コードの例:
package MyApp::Utils; our $global_var = 10; sub do_something { return $global_var + 1; } package main; print MyApp::Utils::do_something(); # 11
主な特徴:
::で明示的に指定する。mainはスクリプトのデフォルトのグローバル名前空間です。my、our、localの違いは何ですか?
myは現在のレキシカルブロック内のみ使用可能。ourはパッケージのグローバル変数を宣言しますが、ブロック内でレキシカルリファレンスとしてアクセス可能にします。localはブロックの存在する間、パッケージのグローバル変数の値を一時的に上書きします。パッケージを明示的に指定せずに関数を呼び出せますか?
はい、関数がExporterモジュールを使用して現在のパッケージにエクスポートされている場合は可能ですが、そうでない場合は完全な名前を使用する必要があります。
1つのファイルに複数のpackageを宣言できますか?
はい、できますが理解が難しくなります。各packageの後はすべての続く宣言が新しい名前空間に関連するためです。各パッケージに別のファイルを使用する方が良いです。
チームスクリプトでは、1つのファイル内でいくつかのpackageが連続して使用されており、変数が混乱し、時にはレキシカル、時にはグローバルになっていました。
利点:
欠点:
各packageを別々のモジュールに移し、関数を明示的にエクスポートしました。
利点:
欠点: