可能重复:
How do I tell if a variable has a numeric value in Perl?
我想确定变量(从字符串解析的值)是否为数字。我怎样才能做到这一点?好吧,我猜/^[0-9]+$/
会起作用,但有更优雅的版本吗?
答案 0 :(得分:24)
您可以使用核心Scalar::Util模块中的looks_like_number()
功能
另请参阅perlfaq中的问题:How do I determine whether a scalar is a number/whole/integer/float?
答案 1 :(得分:20)
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 "a C float\n" }
取自此处:http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Perl
答案 2 :(得分:8)
使用正则表达式,最好使用:
sub is_int {
$str = $_[0];
#trim whitespace both sides
$str =~ s/^\s+|\s+$//g;
#Alternatively, to match any float-like numeric, use:
# m/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/
#flatten to string and match dash or plus and one or more digits
if ($str =~ /^(\-|\+)?\d+?$/) {
print "yes " . $_[0] . "\n";
}
else{
print "no " . $_[0] . "\n";
}
}
is_int(-12345678901234); #yes
is_int(-1); #yes
is_int(23.); #yes
is_int(-23.); #yes
is_int(0); #yes
is_int(+1); #yes
is_int(12345678901234); #yes
is_int("\t23"); #yes
is_int("23\t"); #yes
is_int("08"); #yes
is_int("-12345678901234"); #yes
is_int("-1"); #yes
is_int("0"); #yes
is_int("+1"); #yes
is_int("123456789012345"); #yes
is_int("-"); #no
is_int("+"); #no
is_int("yadz"); #no
is_int(""); #no
is_int(undef); #no
is_int("- 5"); #no
is_int("+ -5"); #no
is_int("23.1234"); #no
is_int("23."); #no
is_int("--1"); #no
is_int("++1"); #no
is_int(" 23.5 "); #no
is_int(".5"); #no
is_int(",5"); #no
is_int("%5"); #no
is_int("5%"); #no
或者,您可以使用POSIX。
use POSIX;
if (isdigit($var)) {
// integer
}