sub is_integer {
defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
}
sub is_float {
defined $_[0] && $_[0] =~ /^[+-]?\d+(\.\d+)?$/;
}
对于上面提到的代码,如果我们将输入设为999999999999999999999999999999999999999999
,则输出不是实数。
为什么表现得那样?
我忘了再说一件事:
如果我将$x
的此代码用作上述值:
if($x > 0 || $x <= 0 ) {
print "Real";
}
输出为real
。
这怎么可能?
答案 0 :(得分:10)
$ perl -e 'print 999999999999999999999999999999999999999999'
1e+42
即。 Perl对此数字使用科学表示,这就是你的正则表达式不匹配的原因。
答案 1 :(得分:7)
使用Scalar::Util中的looks_like_number
功能(这是一个核心模块)。
use Scalar::Util qw( looks_like_number );
say "Number" if looks_like_number 999999999999999999999999999999999999999999;
# above prints "Number"
答案 2 :(得分:3)
再添一件事。正如其他人所解释的那样,您使用的数字超出了Perl整数的范围(除非您使用的是140位计算机)。因此,变量将存储为浮点数。正则表达式对字符串起作用因此,在正则表达式对其进行操作之前,该数字将转换为其字符串表示形式。
答案 3 :(得分:2)
其他人已经解释了发生了什么:开箱即用,Perl无法使用科学记数法处理大数字。
如果您需要处理大数字,请查看bignum或其组件,例如Math::BigInt。例如:
use strict;
use warnings;
use Math::BigInt;
my $big_str = '900000000000000000000000000000000000000';
my $big_num = Math::BigInt->new($big_str);
$big_num ++;
print "Is integer: $big_num\n" if is_integer($big_num);
sub is_integer {
defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
}
答案 4 :(得分:1)
另外,您可能需要查看Perl文档中的bignum。