Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"

Re^2: storage of numbers

by vsespb (Hermit)
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?

Comment on Re^2: storage of numbers
Download Code
Re^3: storage of numbers
by ww (Bishop) 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.

      Well, anyway, the point was you don't always really want accept "Inf" as number. Sometimes you just want "normal" numbers.
      When I told "prints true? " I meant something which is TRUE. Yes, it was 20. Sorry for confusion.
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 the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (9)
As of 2015-07-06 07:59 GMT
Find Nodes?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...

    Results (70 votes), past polls