Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot

Re^4: Check for Positive Integer entry only

by syphilis (Archbishop)
on May 21, 2007 at 13:46 UTC ( #616559=note: print w/replies, xml ) Need Help??

in reply to Re^3: Check for Positive Integer entry only
in thread Check for Positive Integer entry only

int 'comparison operator' int # returns the actual result
int 'comparison operator' string # returns an error

Should (5 == '5') (which is "int 'comparison operator' string") return the result ? Or should it throw an error ? Assuming it should return the result, the following may help:
use warnings; # Write the warnings handler. It only handles runtime errors. # To have it handle compile-time errors, place it in a # BEGIN{} block $SIG{__WARN__} = sub { for my $w (@_) { if($w =~ /isn't numeric/) {die "Treated a string as a number"} else {print "Warning received: $w"} } }; # Generates a compile-time warning ("...used only once...") # that the handler doesn't deal with. $foo = 0; #Generates a runtime warning ("... uninitialized value ...") # that the handler *does* deal with. my $bar; print $bar, "\n"; $int = 7; $string = '5foo'; if($int == 7) {print "Yep, \$int == 7\n"} # Generates a warning that causes the handler to throw # the error if($string == 5) {print "Yep, \$string == 5\n"}
Note, however, that any treatment of $string as a number (eg $string += 3;) will cause the handler sub to throw the error.

Perhaps all you really need is Scalar::Util::looks_like_number() (see 'perldoc Scalar::Util').
use Scalar::Util; . . if(Scalar::Util::looks_like_number($x) && $x > 0) { print "It's a positive number - not necessarily an integer"; }
Maybe even:
use Scalar::Util; . . if(Scalar::Util::looks_like_number($x) && $x > 0 && $x == int($x)) { print "It's a positive integer"; }
But that can be a little dubious, too:
use Scalar::Util; use warnings; $string = '5.' . '0' x 30 . '1';; print $string, "\n"; if(Scalar::Util::looks_like_number($string) && $string > 0 && $string == int($string) ) { print "looks like a positive integer\n"; } else {print "not a positive integer\n"} __END__ Outputs: 5.0000000000000000000000000000001 looks like a positive integer
That probably does the right thing imo, but I wouldn't like to guarantee that everyone would agree.


Replies are listed 'Best First'.
Re^5: Check for Positive Integer entry only
by shobhit (Sexton) on May 30, 2007 at 05:05 UTC
    looks_like_number() is good. But this is also dubious as you have pointed out.
    And number comparison with string should return an error.

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (4)
As of 2023-09-25 09:30 GMT
Find Nodes?
    Voting Booth?

    No recent polls found