#linux #perl
#linux #perl
Вопрос:
Я нахожусь в процессе разработки модуля, который будет вызывать модули Perl на определенных условиях.
И логика будет такой:
$var = "db_tk";
if ( $var =~ /db/ ) {
use dbi;
}
if ( $var =~ /tk/ ) {
use tk;
}
Я не могу запускать их во время выполнения, используя require
.
Комментарии:
1. Почему вы не можете использовать
require
? Вы получаете сообщение об ошибке?2. Я думаю, что теперь у вас есть конкретные ответы на ваш вопрос, но подробнее об этом см. Статью Нила Бауэрса «Модули CPAN, которые (могут) загружать другие модули»
Ответ №1:
use Module;
эквивалентно
BEGIN {
require Module;
import Module;
}
итак, вы хотите
require Module;
import Module;
За исключением импорта из модуля во время выполнения не имеет смысла. Итак, вы либо хотите
# Conditionally load modules at runtime.
# Gotta use fully-qualified names to call provided functions.
my $var = "db_tk";
require DBI if $var =~ /db/;
require Tk if $var =~ /tk/;
или
# Conditionally load modules at compile-time.
BEGIN {
my $var = "db_tk";
if ($var =~ /db/) { require DBI; import DBI; }
if ($var =~ /tk/) { require Tk; import Tk; }
}
Модуль if можно использовать для упрощения последнего:
# Conditionally load modules at compile-time.
my $var;
BEGIN {
$var = "db_tk";
}
use if $var =~ /db/, 'DBI';
use if $var =~ /tk/, 'Tk';
Ответ №2:
«Я не могу запускать их во время выполнения, используя «требовать»» Да, это так. Все, что use
работает, require
также будет работать: use
вызовы require
Предполагая, что вы намеревались использовать стандартные модули CPAN DBI
and Tk
, а не dbi
and tk
, тогда вам нужно это
if ( $var =~ /db/ ) {
use DBI;
}
if ( $var =~ /tk/ ) {
use Tk;
}
Или, если вы ранее определили $var
в BEGIN
блоке, вы можете использовать if
прагму
use if $var =~ /db/, DBI;
use if $var =~ /tk/, Tk;