gpt4 book ai didi

perl - 如何在perl中验证数字?

转载 作者:行者123 更新时间:2023-12-02 05:24:10 26 4
gpt4 key购买 nike

我知道有一个图书馆可以做到这一点

use Scalar::Util qw(looks_like_number);

但我想使用 perl 正则表达式来完成它。我希望它适用于双数,而不仅仅是整数。

所以我想要比这更好的东西

$var =~ /^[+-]?\d+$/

谢谢。

最佳答案

构建单个正则表达式来验证数字确实很困难。要考虑的标准太多了。 Perlfaq4包含一个部分“如何确定标量是否为数字/整数/整数/ 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 一样。最好的做法可能就是直接使用它。

关于perl - 如何在perl中验证数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5965686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com