次のスクリプトを実行した場合:
use strict;
use warnings;
sub load {
use File::Path qw (make_path);
}
load();
make_path('1/2/3/4');
exit 0;
それは完璧に動作します。ロードされたモジュールのスコープをサブルーチンに限定して、モジュールで宣言されたサブルーチンを、それをロードするサブルーチンの外部で使用できないようにします。出来ますか?
簡単な答え:いいえ、これは実際には不可能です。
長い答え:File :: Pathをロードした後、コードが呼び出されるのを防ぐことはできませんFile::Path::make_path()
が、短い名前でavailabelであるスコープを制限することができます。
use File::Path ();
sub load {
local *make_path = \&File::Path::make_path;
make_path('foo/bar/baz'); # This would work...
}
File::Path::make_path('bang/kapow'); # This would work too
make_path('xyxxy/plugh'); # But this would die
ただしlocal
、スコープを使用することにより、構文コードブロックに字句的に制限されません。これは動的スコープであり、によって呼び出されるすべてのコードが動作中のサブルーチンとしてload()
も認識されることを意味します。make_path
この手法はあいまいであり、離れた場所で副作用を説明するのが難しい場合があるため、この手法の使用はお勧めしません。一部の関数をモックアップに置き換えることができるユニットテストを作成する場合に、ほとんどの場合便利です。
Perl開発者は、言語の一部として字句サブを追加することについて議論しています。この機能により、を使用する際の問題なしに、ほぼやりたいことができるようになりますlocal
。しかし、これはまだ進行中であり、perlの開発リリースでは利用できません。
要するに:あなたはできません。'worse'であっても、use
コンパイル時に実行されるため、サブに配置しても違いはありません(外観上の利点を除く)。