Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试Perl字符串是否包含非负数?_Perl - Fatal编程技术网

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

如何测试Perl字符串是否包含非负数?,perl,Perl,我需要检测用户输入的值是否包含正的非零数。输入字段表示产品数量,必须大于零,并且不包含字母或非数字字符。注意,输入必须只包含以下字符:0123456789,但当然,零本身是不可接受的。下面是我如何使用代码: if( $fields{'quantity'} =~ [this is where I am unsure] ) { $errors .= "Please enter a whole number for the quantity."; } 谢谢。记住,像1E4这样的

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

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

谢谢。

记住,像1E4这样的字符串也是数字,所以不是每个数字都必须只包含[0-9]

提供的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";
}
请注意,像楠、INF和无穷大这样的字符串也是如此,所以你也可以考虑除草:

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

我相信使用@Zaid的答案中的looks_like_数字更安全,但这里有一个regexp版本:

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

真的没有必要在输入中考虑像1E4这样的外来词:只需让它们键入一串数字

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

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

LOL,在完全相同的时间键入完全相同的答案:顺便说一句,looks\u like\u number不接受小数,声明:>测试SV的内容是否看起来像一个数字或是一个数字。Inf和Infinity被视为数字,因此不会发出非数字警告,即使您的atof没有对它们进行检查。Get magic被忽略。@吱吱声:是的,看起来你和我在同一时间又在想同一件事:还有Nan、Inf等。胡说八道,代码需要检查输入是否是整数,所以看起来好像这个数字根本不是最好的解决方案!如果您使用looks_like_number来验证外部数据,您可能会得到超出预期的结果@chansen:既然你是模块的作者,为什么不为未来的访问者发布一个答案呢?不会拒绝00或\x{0669}。拒绝00或\x{0669}失败。如果你想匹配任意精度的正整数,你可以使用一个简单的正则表达式:/\a[1-9][0-9]*\z/x,无论给定的输入是否包含其他数字系统,它都只匹配西方阿拉伯数字。
unless ($fields{quantity} and $fields{quantity} !~ /\D/) {
  $errors .= "Please enter a whole number for the quantity.";
}