Могу ли я использовать переменную для задания указанного c пространства имен в perl - PullRequest
1 голос
/ 09 января 2020

Я знаю, что вы можете сделать

package Foo {
    # do stuff
}

, но я не думаю, что смогу сделать

my $namespace = 'Foo';

package $namespace {
    # do stuff
}

, поэтому есть ли способ установить блок "быть" в заданное пространство имен с пространством имен, определенным с помощью переменной?

Или - если быть точным - пространство имен :: local самый простой способ?

Ответы [ 2 ]

1 голос
/ 09 января 2020

Нет, для этого вам нужно перекомпилировать код.

Итак, учитывая

my $foo = sub {
    # code here
};

Do:

my $newfoo = eval "package $package; sub " . B::Deparse->new->coderef2text($foo);
0 голосов
/ 09 января 2020

Нет, код, вычисленный во время выполнения, не может установить пакет, используемый для компиляции того же кода. Уже слишком поздно. Вам придется отложить компиляцию кода, который будет затронут (например, с помощью eval EXPR, do EXPR или require).

(namespace :: local не делает этого.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...