Found in /usr/lib/perl5/5.8.5/pod/perlfaq4.pod
How do I determine whether a scalar is a number/whole/integer/float?
Assuming that you donât care about IEEE notations like "NaN" or "Infinity", you probably just want to use a regular expression.
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" }
There are also some commonly used modules for the task. Scalar::Util (distributed with 5.8) provides access to perlâs internal function
"looks_like_number" for determining whether a variable looks like a number. Data::Types exports functions that validate data types using both the
above and other regular expressions. Thirdly, there is "Regexp::Common" which has regular expressions to match various types of numbers. Those
three modules are available from the CPAN.
If youâre on a POSIX system, Perl supports the "POSIX::strtod" function. Its semantics are somewhat cumbersome, so hereâs a "getnum" wrapper
function for more convenient access. This function takes a string and returns the number it found, or "undef" for input that isnât a C float.
The "is_numeric" function is a front end to "getnum" if you just want to say, ââIs this a float?ââ
sub getnum {
use POSIX qw(strtod);
my $str = shift;
$str =~ s/^\s+//;
$str =~ s/\s+$//;
$! = 0;
my($num, $unparsed) = strtod($str);
if (($str eq ââ) ââ ($unparsed != 0) ââ $!) {
return undef;
} else {
return $num;
}
}
sub is_numeric { defined getnum($_[0]) }
Or you could check out the String::Scanf module on the CPAN instead. The POSIX module (part of the standard Perl distribution) provides the "str-
tod" and "strtol" for converting strings to double and longs, respectively.