Нет, это невозможно без
eval
, так как
require()
нуждается в имени имени голого слова, как описано в
perldoc -f require. Тем не менее, это не злое использование eval, поскольку оно не позволяет вводить произвольный код (при условии, что у вас есть контроль над содержимым файла
require
ing, конечно).
EDIT: Код изменен ниже, но я оставляю первую версию для полноты.
Я использую
я имел обыкновение использовать этот маленький сахар модуль делать динамические нагрузки во время выполнения:
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: [email protected]" };
}
1;
PS. Я смотрю на это определение (я написал его довольно давно), и я размышляю над тем, чтобы добавить это: $class->export_to_level(1, undef, @imports);
... его должен работать, но не проверен.
EDIT: версия 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;
Duplicate: http://stackoverflow.com/questions/442710/how-do-i-use-a-perl-package-known-only-in-runtime –
Извините, что я искал, но не смог, t найти что-нибудь. – user226723
Я бы обновил ваши стандарты кодирования. Нет ничего неправильного или небезопасного в том, строка. Это самый простой способ выполнить то, что вы хотите. Если вы передаете вход пользователя, это еще одна история ... – runrig