如何测试Perl字符串是否包含非负数?

时间:2013-01-20 12:54:32

标签: perl

我需要检测用户输入的值是否包含正数非零数字。输入字段表示产品数量,且必须大于零,并且不包含字母或非数字字符。 IOW,输入必须只包含这些字符:0123456789但当然,零本身是不可接受的。以下是我使用代码的方式:

  if( $fields{'quantity'} =~ [this is where I am unsure]  )
  {
    $errors .= "Please enter a whole number for the quantity.";
  }

感谢。

3 个答案:

答案 0 :(得分:4)

请注意,1E4等字符串也是数字字符,因此并非每个数字都必须包含[0-9]

Scalar::Util提供的looks_like_number功能是检查变量是否为数字的正确方法。

use Scalar::Util 'looks_like_number';

if ( not looks_like_number( $fields{quantity} ) or $fields{quantity} <= 0 ) {

    warn "Please enter a whole number for the quantity";
}

同样的事情更简洁:

warn "Please enter a whole number for the quantity"
  unless looks_like_number( $fields{quantity} )
         && $fields{quantity} > 0;

请注意,NanInfInfinity等字符串也是deemed numeric,所以您可能还想考虑除草这些字符串:

warn "Please enter a whole number for the quantity"
  unless looks_like_number( $fields{quantity} )
         && $fields{quantity} !~ /Inf|NaN/i
         && $fields{quantity} > 0;

答案 1 :(得分:3)

确实没有必要在输入中允许像1E4这样的外来物:只需让它们键入一串数字。

此外,检查输入值的真实性将清除undef,零和空字符串,因此这将正常工作。它检查输入是否已定义,非空,非零,并且不包含非数字字符。

unless ($fields{quantity} and $fields{quantity} !~ /\D/) {
  $errors .= "Please enter a whole number for the quantity.";
}

答案 2 :(得分:2)

我认为使用来自Scalar::Utillooks_like_number作为@Zaid指出的答案更安全,但这是一个正则表达式版本:

if (not defined $fields{'quantity'}) or $fields{'quantity'} !~ /^[0-9]+$/ or $fields{'quantity'} <= 0) {
    $errors .= "Please enter a whole number for the quantity.";
}