我知道我可以在Perl中有条件地使用模块但是“pragma”呢?我的测试表明use bigint
可能比Perl中的普通数学慢得多,我只需要它来处理64位整数,所以我只想在Perl没有用64位整数支持构建时使用它,我也知道如何使用Config
模块进行检查。
我尝试使用eval
和BEGIN
块进行各种操作,但无法有条件地使用bigint。我知道我可以使用Math::BigInt
但是我不能对bigint和64位情况使用单个代码路径。
答案 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}}函数,它们将失败。