Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re^7: Reliably parsing an integer

by hippo (Chancellor)
on Jun 30, 2020 at 08:55 UTC ( #11118710=note: print w/replies, xml ) Need Help??

in reply to Re^6: Reliably parsing an integer
in thread Reliably parsing an integer

Besides, the "eq" is actually converting the integer back to a string, which will cost performance.
#!/usr/bin/env perl use strict; use warnings; use Benchmark 'timethis'; timethis (10_000_000, "valid_int ('18446744073709551614')"); sub valid_int { my $num = shift; return unless $num =~ /^\d+$/a; return int $num eq $num; } __END__ timethis 10000000: 8 wallclock secs ( 7.93 usr + 0.00 sys = 7.93 CP +U) @ 1261034.05/s (n=10000000)

So, less than a microsecond on my aging system. Doubtless this can be improved upon (although about half the time taken appears to be the regex so there's a limit there too).

Replies are listed 'Best First'.
Re^8: Reliably parsing an integer
by rdiez (Acolyte) on Jun 30, 2020 at 10:34 UTC
      Can you see any bugs?

      In perl, strings like "2e5" and "1E4" are valid integer strings.
      Are they being handled as you would like ? (I haven't investigated, and it depends upon how you want them to be treated.)

      If you want to accept them then you also have to keep in mind that if they represent values greater than ~0 or less than -(~0 >> 1) then they'll be assigned to NVs (floating point values) rather than IVs (integer value).

      I guess it's probably simplest if you reject them.

      Update, correcting an earlier incorrect update: After I wrote this post I discovered that if you assign a value like 2e5 as a bareword, you get an NV, not an IV - and I therefore thought I had made a mistake in asserting that such strings were "integer strings".
      However, although the barewords often assign as an NV, the above assertions seem to be correct in relation to numifying strings.
      It seems a bit random.
      We get an NV with:
      C:\>perl -MDevel::Peek -le "$x = 1e6; Dump $x;" SV = NV(0x488470) at 0x488488 REFCNT = 1 FLAGS = (NOK,pNOK) NV = 1000000
      but an IV if we perform some arithmetic function:
      C:\>perl -MDevel::Peek -le "$x = 1e6 * 1.0; Dump $x;" SV = IV(0x4ecb10) at 0x4ecb20 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 1000000
      and, as regards what I've written above, if we numify the string we still get an IV:
      C:\>perl -MDevel::Peek -le "$x = '1e6' * 1.0; Dump $x;" SV = IV(0x33d010) at 0x33d020 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 1000000
      unless the value represented by the string is outside of the IV range:
      C:\>perl -MDevel::Peek -le "$x = '1e70' * 1.0; Dump $x;" SV = NV(0x576440) at 0x576458 REFCNT = 1 FLAGS = (NOK,pNOK) NV = 1e+70

      A reply falls below the community's threshold of quality. You may see it by logging in.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11118710]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (3)
As of 2021-01-28 02:17 GMT
Find Nodes?
    Voting Booth?