パッケージがわからないということは、読み込みメカニズムによって情報が返されなければならないことを意味するため、 を使用する必要があることを意味しますdo
。
Usingdo
は、シンボル テーブルを使用できないことを意味します。これは、匿名サブを意味します。
次のようなファイルを作成します。
sub foo { ... }
sub bar { ... }
{
foo => \&foo,
bar => \&bar,
};
または好き
{
foo => sub { ... },
bar => sub { ... },
};
次に使用します
my $table = do '/abs/path/to/file.pl' or die $@;
$table{foo}->();
また
my $table = do 'rel/path/to/file.pl' or die $@; # Relative to entries in @INC
$table{foo}->();
複数回呼び出すことはできますdo
が、毎回ファイルをコンパイルして実行するので避けてください。代わりに、返される値をキャッシュします。
醜い!そして、ファイル名とその中のパッケージとの間に何の関係も望まないからです。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も参照してください。