Не зная, что пакет означает, что информация должна быть возвращена механизмом загрузки, что означает, что нам нужно использовать do
.
Использование do
означает, что мы не можем использовать таблицу символов, что означает анонимные подпрограммы.
Создайте файл, который выглядит следующим образом:
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
более одного раза, но избегайте его, поскольку он компилирует и запускает файл каждый раз. Вместо этого кэшируйте возвращаемое значение.
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();
См. Также Модуль :: PluginFinder .