我不知道这是否是一种“好”的方式,但你可以做一个简单的操作,看看你得到的是 bigint/bigrat 结果还是传统的 Perl 结果。
$bigint_enabled = length(1E20) == 21; # conventional result is 5
冒着使这个答案变得更差的风险,您如何确定是否在调用者的范围内启用了 bigint?
一。要求调用者告诉你是否启用了 bignum。
# 你的包裹
package Foo;
use base 'Exporter';
use bigint;
our @EXPORT = qw($BIGINT_TEST multiply);
our $BIGINT_TEST = $]>=5.009004
? "bigint::in_effect()"
: "\$bigint::VERSION<0.22 || length(1E20)==21";
sub multiply {
my ($arg1, $arg2, $bigint_enabled) = @_;
if ($bigint_enabled) {
use bigint;
return $arg1*$arg2;
} else {
no bigint;
return $arg1*$arg2;
}
}
# user program
use Foo;
use bigint;
print "Enabled: ", multiply(1E15,1E10, eval $BIGINT_TEST), "\n";
{
no bigint;
print "Disabled: ", multiply(1E15,1E10,eval $BIGINT_TEST), "\n";
}
# result
$ perl510 user_program.pl
Enabled: 10000000000000000000000000
Disabled: 1e+25
$ perl587 user_program.pl ($bignum::VERSION eq 0.07)
Enabled: 10000000000000000000000000
Disabled: 10000000000000000000000000
$ perl588 user_program.pl (includes upgrade to bignum 0.25)
Enabled: 10000000000000000000000000
Disabled: 1e+25
二。源过滤?破解操作树?使用这些方法中的任何一种来向方法调用插入一个参数或在方法调用之前设置一个全局变量。