in reply to "2" | "8" = ":" and 2|8=10

I think that if I *really* did need to know whether the variable had one of the numeric flags set, then I'd probably use an XSub ... something like:
use warnings; use strict; use Inline C => Config => BUILD_NOISY => 1; use Inline C =><<'EOC'; int is_num(SV * x) { if(SvIOK(x) || SvUOK(x) || SvNOK(x)) return 1; return 0; } EOC my $ui = ~0; print is_num(2), "\n"; print is_num("2"), "\n"; print is_num($ui), "\n"; print is_num("$ui"), "\n"; print is_num(2.3), "\n"; print is_num("2.3"), "\n";
I know how to force a string to an integer using int()

The usual way to force numeric context is to add 0 (as already demonstrated) or multiply by 1. Using int() will truncate fractional values, thereby altering them.

Cheers,
Rob

Replies are listed 'Best First'.
Re^2: "2" | "8" = ":" and 2|8=10
by ikegami (Patriarch) on Nov 04, 2011 at 20:19 UTC

    Note: This doesn't take magic into account. The bitwise ops sure do.

    print is_num($|), "\n"; # 0 $|=1; print is_num($|), "\n"; # 0 print 1 | "A", "\n"; print "1" | "A", "\n"; print $| | "A", "\n"; # Acts as if $| is numeric

    Note: SvUOK(x) will always be false if SvIOK(x) is false, and SvNIOK(x) is more efficient than SvIOK(x) || SvNOK(x).