我知道有一个图书馆可以做到这一点
使用 Scalar::Util qw(looks_like_number);
但我想使用 perl 正则表达式来做到这一点。我希望它适用于双数,而不仅仅是整数。
所以我想要比这更好的东西
$var =~ /^[+-]?\d+$/
thanks.
构建单个正则表达式来验证数字确实很困难。需要考虑的标准太多了。Perlfaq4 http://perldoc.perl.org/perlfaq4.html#How-do-I-determine-whether-a-scalar-is-a-number/whole/integer/float?包含一节“如何确定标量是否是数字/整数/整数/浮点?
该文档中的代码显示了以下测试:
if (/\D/) {print "has nondigits\n" }
if (/^\d+$/) {print "is a whole number\n" }
if (/^-?\d+$/) {print "is an integer\n" }
if (/^[+-]?\d+$/) {print "is a +/- integer\n" }
if (/^-?\d+\.?\d*$/) {print "is a real number\n" }
if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) {print "is a decimal number\n"}
if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/) {
print "is a C float\n"
}
- 第一个测试取消了无符号整数的资格。
- 第二次测试合格了一个整数。
- 第三个测试合格一个整数。
- 第四个测试限定正/负符号整数。
- 第五次测试合格的实数。
- 第六次测试合格十进制数。
- 第七个测试验证了 C 风格科学记数法中的数字。
因此,如果您正在使用这些测试(不包括第一个测试),您将必须验证一个或多个测试是否通过。然后你就有了一个号码。
另一种方法,由于你不想使用Scalar::Util这个模块,所以可以从IN Scalar::Util的代码中学习。 looks_like_number() 函数的设置如下:
sub looks_like_number {
local $_ = shift;
# checks from perlfaq4
return $] < 5.009002 unless defined;
return 1 if (/^[+-]?\d+$/); # is a +/- integer
return 1 if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/); # a C float
return 1 if ($] >= 5.008 and /^(Inf(inity)?|NaN)$/i)
or ($] >= 5.006001 and /^Inf$/i);
0;
}
您应该能够使用该函数中适合您情况的部分。
不过,我想指出的是,Scalar::Util
是核心 Perl 模块;它与 Perl 一起提供,就像strict
做。最好的做法可能就是直接使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)