Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re^2: storage of numbers

by vsespb (Chaplain)
on Oct 16, 2013 at 17:57 UTC ( #1058521=note: print w/replies, xml ) Need Help??

in reply to Re: storage of numbers
in thread storage of numbers

Do you know that
perl -MScalar::Util=looks_like_number -e 'print looks_like_number "Inf +"'
prints true?

Replies are listed 'Best First'.
Re^3: storage of numbers
by ww (Archbishop) on Oct 16, 2013 at 19:56 UTC

    That's not what happens under Win7, perl 5.16, and the latest AS 5.16-repository version of Scalar::Util (with quotes adjusted for MS pleasure):

    C:\>perl -MScalar::Util=looks_like_number -e "print looks_like_number +'Inf'" 20

    Oh. OK, if you say so. But why did the output ne 'True' (unless 'Inf/INF/inf' is treated as NAN?
    Just then, though, a lightbulb flashed on -- AhHA,   /me said to myself!     RTFM!

    looks_like_number EXPR Returns true if perl thinks EXPR is a number. See "looks_like_number" +in perlapi.

    Unfortunately, the link, <a href="/perldoc?perlapi#looks_like_number" class="podlinkpod">&#34;looks_like_number&#34; in perlapi</a> (to which 'See' directs us) is broken.

    So forging blindly onward with what seemed, OTTOMH, some semi-plausible alternatives:

    C:\>perl -e "use Scalar::Util(looks_like_number); print looks_like_num +ber 'Inf'" 20 C:\>perl -e "use Scalar::Util(looks_like_number); print looks_like_num +ber 'foo'" 0 C:\>perl -e "use Scalar::Util(looks_like_number); print looks_like_num +ber 'inf'" 20 C:\>perl -e "use Scalar::Util(looks_like_number); print looks_like_num +ber '7'" 1 C:\>perl -e "use Scalar::Util(looks_like_number); print looks_like_num +ber '7874321907'" 2 C:\>perl -e "use Scalar::Util(looks_like_number); print looks_like_num +ber(7874321907)" 8704

    It all leaves me deep in 'WTF' territory and slipping into the quicksand.

    So prithee, Wiser heads: Prevail! and halp, hal blubh blub o o ....

    Update: added first 1.5 sentences after the first blockquoted code.

      When I told "prints true? " I meant something which is TRUE. Yes, it was 20. Sorry for confusion.
      Well, anyway, the point was you don't always really want accept "Inf" as number. Sometimes you just want "normal" numbers.
Re^3: storage of numbers
by davido (Archbishop) on Oct 16, 2013 at 21:23 UTC

    Do you know that...

    Yes, it's documented in perlapi. I didn't assume that would be a concern for the OP.

    The old pure-Perl version of Scalar::Util has a pure-Perl version of looks_like_number, which includes the following code:

    return 1 if ( $] >= 5.008 and /^(Inf(inity)?|NaN)$/i ) or ( $] >= 5.006001 and /^Inf$/i );

    So if we wanted to eliminate that behavior, we could either copy/paste and modify the entire pure-Perl version from an old version of Scalar::Util (but it has issues with '0 but true'), or use the modern version of Scalar::Util::looks_like_number like this:

    sub looks_like_finite_number { my $candidate = shift; return 0 if ! looks_like_number( $candidate ); return 0 if ( $] >= 5.008 and $candidate =~ /^(Inf(inity)?|NaN)$/i) or ( $] >= 5.006001 and $candidate =~ /^Inf$/i ); return 1; }

    Or, in perlfaq4 there is a series of regexes given for determining if one is looking at a number under the section, "How do I determine whether a scalar is a number/whole/integer/float? It's not pretty, and that FAQ answer has even changed over the years; it used to use a bunch of "if" statements. Now it uses given/when. *sigh*


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1058521]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2018-05-25 05:24 GMT
Find Nodes?
    Voting Booth?