Using Patterns to Match Numeric Values
Problem
You need to make sure a string looks like a number.
Solution
Use a pattern that matches the type of number you’re looking for.
Discussion
Patterns can be used to classify values into several types of numbers:
|
Pattern |
Type of value the pattern matches |
|---|---|
/^\d+$/ |
Unsigned integer |
/^-?\d+$/ |
Negative or unsigned integer |
/^[-+]?\d+$/ |
Signed or unsigned integer |
/^[-+]?(\d+(\.\d*)?|\.\d+)$/ |
Floating-point number |
The pattern /^\d+$/ matches unsigned integers by
requiring a nonempty value that consists only of digits from the
beginning to the end of the value. If you care only that a value
begins with an integer, you can match an initial numeric part and
extract it. To do this, match just the initial part of the string
(omit the $ that requires the pattern to match to
the end of the string) and place parentheses around the
\d+ part. Then refer to the matched number as
$1 after a successful match:
if ($val =~ /^(\d+)/)
{
$val = $1; # reset value to matched subpart
}You could also add zero to the value, which causes Perl to perform an implicit string-to-number conversion that discards the non-numeric suffix:
if ($val =~ /^\d+/)
{
$val += 0;
}However, if you run Perl with the -w option (which I
recommend), this form of conversion generates warnings for values
that actually have a non-numeric part. It will also convert string
values like 0013 to the number
13, which may be unacceptable in some contexts.
Some kinds of numeric values have a ...