in reply to storage of numbers

use Scalar::Util qw( looks_like_number ); while( <> ) { next unless looks_like_number($_); chomp; $min = ! defined( $min ) || $min > $_ ? $_ : $min; $max = ! defined( $max ) || $max < $_ ? $_ : $max; } print "\nminimum number: $min\n"; print "maximum number: $max\n";

Dave

Replies are listed 'Best First'.
Re^2: storage of numbers
by vsespb (Chaplain) on Oct 16, 2013 at 17:57 UTC
    Do you know that
    perl -MScalar::Util=looks_like_number -e 'print looks_like_number "Inf +"'
    prints true?

      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.

      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*


      Dave