Как «использовать» модуль во время выполнения

#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;