Можно ли условно "использовать bigint" с Perl?

Я знаю, что могу условно использовать модуль в Perl, но как насчет "прагм"? Мои тесты показали, что use bigint может быть намного медленнее, чем нормальная математика в Perl, и мне нужно только обрабатывать 64-битные целые числа, поэтому я хочу использовать его только тогда, когда Perl не был построен с поддержкой 64-разрядной целой, что я также знаете, как проверить использование модуля Config.

Я пробовал разные вещи с помощью блоков eval и BEGIN, но не смог выработать способ условного использования bigint. Я знаю, что могу использовать Math::BigInt, но тогда я не могу использовать одиночную кодовую версию как для bigint, так и для 64-битных случаев.

Ответы

Ответ 1

Это действительно отлично работает:

use Config;
BEGIN {
  if (! $Config{use64bitint}) {
    require bigint;
    bigint->import;
  }
}

Взаимодействие между разными временами компиляции является сложным (возможно, я вернусь и попытаюсь объяснить его позже), но достаточно сказать, что, поскольку здесь нет строки eval, флаг, который устанавливает набор bigint, будет сохраняться через остальную часть файл или блок, которые вы помещаете в этот блок BEGIN внутри.

Ответ 2

Вы можете взять ответ hobbs и вставить его в модуль.

package int64;

use Config;

sub import {
    if (! $Config{use64bitint}) {
        require bigint;
        bigint->import;
    }
}

1;

Тогда use int64 будет делать то, что вы имеете в виду. Несмотря на то, что bigint является лексическим, вызов его в другой процедуре импорта заставит его пройти по своей магии.

Ответ 3

Используйте модуль if. Он использует goto, чтобы скрыть свой собственный стек стека, поэтому он, как если бы прагма вызывалась напрямую.

Решения, данные ранее, могут работать для bigint и большинства прагм, но они не работают для import функций, которые используют caller.