如何验证perl中的数字?

lit*_*tar 2 validation perl numbers

我知道有一个库可以做到这一点

使用Scalar :: Util qw(looks_like_number);

但我想用perl正则表达式来做.而且我希望它能用于双数而不仅仅是整数.

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

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

谢谢.

Dav*_*idO 15

构造单个正则表达式来验证数字确实很困难.只有太多的标准需要考虑. Perlfaq4包含一节"如何确定标量是一个数字/整数/整数/浮点数?

该文档中的代码显示以下测试:

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"
}
Run Code Online (Sandbox Code Playgroud)
  • 第一个测试取消了无符号整数的资格.
  • 第二次测试符合整数.
  • 第三个测试限定整数.
  • 第四个测试限定正/负符号整数.
  • 第五次测试符合实数.
  • 第六次测试限定十进制数.
  • 第七次测试用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;
}
Run Code Online (Sandbox Code Playgroud)

您应该能够使用适用于您的情况的该功能部分.

但是,我想指出,这Scalar::Util是一个核心Perl模块; 它与Perl一起提供,就像它一样strict.所有人的最佳做法可能只是使用它.


Bil*_*ert 6

你应该使用Regexp :: Common,大多数模式比你意识到的更复杂.

use Regexp::Common;

my $real = 3.14159;
print "Real" if $real =~ /$RE{num}{real}/;
Run Code Online (Sandbox Code Playgroud)

但是,默认情况下不会锚定模式,因此更严格的版本是:

my $real_pat = $RE{num}{real};
my $real     = 3.14159;
print "Real" if $real =~ /^$real_pat$/;
Run Code Online (Sandbox Code Playgroud)