Нет, без eval
невозможно, так как require()
требуется имя модуля голого слова, как описано в perldoc -f require . Однако использование eval не является злым, поскольку не допускает внедрения произвольного кода (конечно, при условии, что вы контролируете содержимое файла, который вы require
используете).
РЕДАКТИРОВАТЬ: Код исправлен ниже, но я оставляю первую версию для полноты.
Я использую Я использовал этот маленький сахарный модуль для динамических нагрузок во время выполнения:
package MyApp::Util::RequireClass;
use strict;
use warnings;
use Exporter 'import'; # gives you Exporter's import() method directly
our @EXPORT_OK = qw(requireClass);
# Usage: requireClass(moduleName);
# does not do imports (wrong scope) -- you should do this after calling me: $class->import(@imports);
sub requireClass
{
my ($class) = @_;
eval "require $class" or do { die "Ack, can't load $class: $@" };
}
1;
PS. Я смотрю на это определение (я написал это довольно давно), и я размышляю над тем, чтобы добавить это:
$class->export_to_level(1, undef, @imports);
... это должно работать, но не тестируется.
РЕДАКТИРОВАТЬ : версия 2 сейчас, намного лучше без Eval (спасибо YSTH)::)
package MyApp::Util::RequireClass;
use strict;
use warnings;
use Exporter 'import'; # gives you Exporter's import() method directly
our @EXPORT_OK = qw(requireClass);
# Usage: requireClass(moduleName);
# does not do imports (wrong scope) -- you should do this after calling me: $class->import(@imports);
sub requireClass
{
my ($class) = @_;
(my $file = $class) =~ s|::|/|g;
$file .= '.pm';
require $file; # will die if there was an error
}
1;