Можно ли условно «использовать bigint» с Perl? - PullRequest
13 голосов
/ 15 марта 2011

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

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

Ответы [ 3 ]

15 голосов
/ 15 марта 2011

Это на самом деле работает просто отлично:

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

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

13 голосов
/ 15 марта 2011

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

package int64;

use Config;

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

1;

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

12 голосов
/ 15 марта 2011

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

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

...