NAME
sscanf - emulate the sscanf() of the C
stdio library
SYNOPSIS
use String::Scanf; # this will import sscanf() into the
# current namespace
@values = sscanf($scanf_format_string, $scalar_to_scan);
# the default scan target is the $_
@values = sscanf($scanf_format_string);
# converting scanf formats to regexps (::format_to_re
# is never exported to the current namespace)
$regexp_string = String::Scanf::format_to_re($scanf_format_string);
DESCRIPTION
Perl sscanf() can be used very much like the C
stdio sscanf(), for detailed sscanf() documentation please refer to your usual documentation resources. The supported formats are: [diuoxefgsc]
and the character class []
.
All of the format must match. If not, an empty list is returned and all the values end up empty.
The c
format returns an anonymous list (see perlref) containing the numeric values of the characters it matched.
The ::format_to_re() function may be helpful if one wants to develop her own parsing routines.
FEATURES
Embedded underscores are accepted in numbers just like in Perl, even in octal/hexadecimal numbers (Perl does not currently support this). Please note the word embedded, not leading or trailing.
If the oh
formats are used, the octal/hexadecimal interpretation is forced even without the leading 0
or 0x
.
LIMITATIONS
Certain features of the C sscanf() are unsupported:
* the formats C<[npSC]>
* in the C<[efg]> formats the C<INF> and various C<NaN>s
The numeric formats are scanned in as strings, this meaning that numeric overflows may occur. For example: 1.2345e67890
will match the %g
format but in most machines Perl cannot handle that large floating point numbers and bizarre values may end up in the Perl variable. Similar caveats apply for integer-type numbers. Results of such huge numbers (or very tiny numbers, say, 1.24345e-67890
) are implementation-defined, which translates quite often as garbage. NOTE: if you really want Big numbers please consider using the Math::BigInt
and Math::BigFloat
, these packages come standard with Perl 5, or the Math::Pari
package, available from CPAN
.
For Perl <integers> and floating point numbers are the same thing. Also, the possible hl
modifiers for the integers mean nothing: they are accepted but still they do nothing because Perl does not care about short/long integer differences.
The character class format is not so rigorously checked for correctness that an illegal character class definition could not be sneaked in. For example [z-a,X]
is a bad
example: perfectly illegal as a character class but String::Scanf
will happily accept it. Beware.
The ::format_to_re() only does the scanf format -> regular expression conversion. It ignores tricky things like the c
format (see above) and the %n$ argument reordering. If you want these, you may as well use the full ::sscanf().
EXAMPLES
# business as usual
($i, $s, $x) = sscanf('%d %3s %g', ' -5_678 abc 3.14e-99 9');
# 'skip leading whitespace': $x becomes 42 despite the leading space
# 'the illegal character': $y becomes 'ab' despite the '3'
# 'c' format: $z becomes [120 100], the numeric values of 'x'
# and 'd' (assuming ASCII or ISO Latin 1)
($x, $y, $z) = sscanf('%i%3[a-e]%2c', ' 42acxde');
# reordering the arguments: $a becomes 34, $b becomes 12
($a, $b) = sscanf('%2$d %1$d', '12 34');
# converting scanf formats to regexps
$re = String::Scanf::format_to_re('%x');
More examples in the test set t/scanf.t
.
INTERNALS
The Perl sscanf()
turns the C
-stdio
style sscanf()
format string into a Perl regexp (see perlre) which captures the wanted values into submatches and returns the submatches as a list.
Originally written for purposes of debugging but also useful for educational purposes:
String::Scanf::debug(1); # turn on debugging: shows the regexps
# used and the possible reordering list
# and the character (%c) conversion targets
String::Scanf::debug(0); # turn off debugging
print String::Scanf::debug(), "\n"; # the current debug status
VERSION
v1.1, $Id: Scanf.pm,v 1.8 1995/12/27 08:32:28 jhi Exp $
AUTHOR
Jarkko Hietaniemi, Jarkko.Hietaniemi@iki.fi