Можно ли условно "использовать 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
.