Perl needs is_number and similar functions (nearly built in)
In my years of Perl training I often encounter people who complain that there is no is_number function in Perl. I keep asking them what do they mean by number? Is that a whole number, a real number a decimal number a hex? Would they accept .3 as a number ? and What about 3. ? I keep telling them it is better to craft their own little regex or to use Regexp::Common.
Unfortunately I also keep encountering bad implementations of these functions in my consulting time at clients. For example this one:
=head2 check_if_number
Checks if the arguments value is a positive integer
=cut
sub check_if_number {
my ($argument, $msg, $err_list) = @_;
if ($argument !~ /^\s*\$/) {
if ($argument <= 0 || $argument !~ /\d+/) {
push @{$err_list}, $msg;
}
}
}
How many bugs can you spot?
So what is the conclusion? Does Perl need to have an is_number function?
comments Sam Vilain
A solution
Some people have reminded me of Scalar::Util and the Scalar::Util::looks_like_number() function that is in core perl since 5.007003 which means the 5.8 line already has it.
But that it has a side effect. The following code will print "yes" two times.
use Scalar::Util
# Manuel export with a shorter name *num = \&Scalar::Util::looks_like_number;
print "Yes\n" if num('inf'); print "Yes\n" if num('infinity');
Personally I think this manual exporting to an even shorter name just asks for maintenance headache as now the user who know looks_like_number will have to learn that in this script it is called num().
Another option on CPAN is to use the is_numeric() function of
[dist://Data::Validate] by Richard Sonnen
which is a wrapper around Scalar::Util::looks_like_number().
Anyway, thanks for the feedback.