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
[email protected]
https://mail.pm.org/mailman/listinfo/boston-pm