是否有可能在Perl中有条件地“使用bigint”?

时间:2011-03-15 10:50:09

标签: perl conditional biginteger

我知道我可以在Perl中有条件地使用模块但是“pragma”呢?我的测试表明use bigint可能比Perl中的普通数学慢得多,我只需要它来处理64位整数,所以我只想在Perl没有用64位整数支持构建时使用它,我也知道如何使用Config模块进行检查。

我尝试使用evalBEGIN块进行各种操作,但无法有条件地使用bigint。我知道我可以使用Math::BigInt但是我不能对bigint和64位情况使用单个代码路径。

3 个答案:

答案 0 :(得分:15)

这实际上运作得很好:

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

不同编译时间之间的交互是复杂的(也许我会回来并尝试稍后解释)但是足以说明,因为这里没有字符串eval,bigint设置的标志将持续通过其余的你把那个BEGIN块放在里面的文件或块。

答案 1 :(得分:13)

你可以把霍布斯的答案拿到一个模块中。

package int64;

use Config;

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

1;

然后use int64会按你的意思行事。即使bigint是词法,在另一个导入例程中调用它也会使它传递它的魔力。

答案 2 :(得分:12)

使用if模块。它使用goto来隐藏自己的堆栈帧,就好像直接调用了编译指示一样。

之前提供的解决方案可能适用于bigint和大多数编译指示,但对于使用import的{​​{1}}函数,它们将失败。