我不知道这是否有资格作为一个“好”的方式,但你可以做一个简单的操作,看看你是否得到了bigint/bigrat结果或传统的Perl结果。
$bigint_enabled = length(1E20) == 21; # conventional result is 5
在作出这样的回答就更少了良好的风险,你怎么能确定BIGINT是否在调用者的范围启用?
一。要求主叫方告诉您是否启用了bignum。
# your package
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
两个。源过滤?破解op树?使用这些方法中的任何一个将方法调用的参数插入或在方法调用之前设置全局变量。
来源
2011-06-07 19:17:26
mob
有没有什么办法可以在来电者的词汇空间中做到这一点?我正在编写一个函数,需要知道它是否从已加载bignum的作用域调用。 – 2011-06-07 19:56:57
首先,如果'$ bignum :: VERSION <0.22',那么'bigint'和'bigrat'不是词法范围的,你不需要为调用者的范围单独测试。当调用者使用Perl 5.8时,这很可能(虽然不是确定的)。 – mob 2011-06-07 20:21:18