不知道包是否意味着信息必須由加載機制返回,這意味着我們需要使用do
。
使用do
表示我們不能使用符號表,這意味着匿名潛艇。
創建一個看起來像下面這樣的文件:
sub foo { ... }
sub bar { ... }
{
foo => \&foo,
bar => \&bar,
};
或類似
{
foo => sub { ... },
bar => sub { ... },
};
然後使用
my $table = do '/abs/path/to/file.pl' or die [email protected];
$table{foo}->();
或
my $table = do 'rel/path/to/file.pl' or die [email protected]; # Relative to entries in @INC
$table{foo}->();
您可以多次調用do
,但要避免它,因爲它每次編譯和運行文件。相反,緩存它返回的值。
UGLY!而所有這些都是因爲你不希望文件名和其中的包之間有任何關係。如果你試圖繞過Perl的要求,期待醜陋。它甚至不幫你有這個要求,所以擺脫它。
什麼應該做的,而不是爲創建一個看起來像下面這樣的文件:
package Some::Package;
sub foo { shift; ... }
sub bar { shift; ... }
1;
調用代碼將是:
my $file= 'Some/Package.pm';
my $pkg = $file;
$file =~ s{\.pm\z}{};
$file =~ s{/}{::}g;
require $file;
$pkg->foo();
也Module::PluginFinder見。
如果你甚至不知道你正在嘗試使用的模塊名稱,你怎麼知道有'sub1'? – cjm 2012-03-24 04:58:46
你爲什麼試圖這樣做?你只是好奇,還是你有充分的理由? – 2012-03-24 07:34:08
原因是我使用modulinos作爲腳本和模塊。操作的實際名稱由文件名錶示,而不是包名稱。 – rmarimon 2012-03-24 13:40:06