There are two things you can do:

a) use regular expressions on the "numbers" to see if they conform
to known format, and then eval iff they do; you can then bypass eval
for integer/float since +0 will cover it.

    e.g; e.g; /\s+0b[01]+\s+/

You should be able to crib RE from RegExp::Common, no need to install
and use the full module.

b) use regular expressions to identify the format plus some packing/
unpacking and code-point indexing to convert the number without eval:

    # binary 285, this implementation is sensitive to leading zeroes--
    # others may not be--and requires whole bytes. Padding is left as
    # an exercise for the reader
    $num = numpack("B*", "0000000100011101");

    #hex 3735928559
    $num = numpack("H*", "deadbeef")

    sub numpack {
        my($fmt, $val)=@_;
        my($i, $sum)=(1, 0);

        my @char =split //, unpack("a*", pack($fmt, $val));
        my $bytes=scalar(@char); 
        foreach(@char){ $sum+=ord()<<(8*($bytes-$i++))}; #shift and add bytes
        return $sum
    }

_______________________________________________
Boston-pm mailing list
Boston-pm@pm.org
https://mail.pm.org/mailman/listinfo/boston-pm

Reply via email to