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

hip*_*ail 13 perl conditional biginteger

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

我尝试了各种各样的东西evalBEGIN块,但无法找到有条件使用bigint的方法.我知道我可以使用Math::BigInt但是我不能为bigint和64位情况使用单个代码路径.

hob*_*bbs 15

这实际上工作得很好:

use Config;
BEGIN {
  if (! $Config{use64bitint}) {
    require bigint;
    bigint->import;
  }
}
Run Code Online (Sandbox Code Playgroud)

不同编译时间之间的交互是复杂的(也许我会回来并尝试稍后解释),但足以说因为这里没有字符串eval,bigint设置的标志将持续通过文件的其余部分或阻止您将BEGIN块放入其中.


Sch*_*ern 13

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

package int64;

use Config;

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

1;
Run Code Online (Sandbox Code Playgroud)

然后use int64会做你的意思.尽管bigint是词法,但在另一个导入例程中调用它会使它传递它的魔力.

  • 不要忘记在模块结束时返回1! (2认同)

ike*_*ami 12

使用if模块.它用于goto隐藏自己的堆栈帧,因此就好像直接调用了pragma一样.

之前给出的解决方案可能适用于bigint大多数编译指示,但对于import使用的函数它们将失败caller.