Encode-Positive-Digits
view release on metacpan or search on metacpan
lib/Encode/Positive/Digits.pm view on Meta::CPAN
{my ($number, $digits) = @_; # Number to decode, encoding digits
my @b = split //, $digits;
my $b = @b;
$b > 1 or confess
"number of decoding digits supplied($b) too few, must be at least 2";
my @n = split //, $number;
my $n = @n;
for(1..$n) # Convert each digit to be decoded with its decimal equivalent
{my $d = $n[$_-1];
my $i = index($digits, $d);
$i < 0 and confess "Invalid digit \"$d\" in number $number at position $_";
$n[$_-1] = $i;
}
my $p = Math::BigInt->new(1);
my $s = Math::BigInt->new(0);
for(reverse @n) # Decode each digit
{$s += $p * $_;
lib/Encode/Positive/Digits.pm view on Meta::CPAN
=head1 Synopsis
use Encode::Positive::Digits;
ok 101 == Encode::Positive::Digits::encode( "5", "01");
ok 5 == Encode::Positive::Digits::decode("101", "01");
ok "hello world" eq Encode::Positive::Digits::encode(4830138323689, " abcdefghlopqrw");
ok 4830138323689 == Encode::Positive::Digits::decode("hello world", " abcdefghlopqrw");
The numbers to be encoded or decoded can be much greater than 2**64 via support
from L<Math::BigInt>, such numbers should be placed inside strings to avoid
inadvertent truncation.
my $n = '1'.('0'x999).'1';
my $d = Encode::Positive::Digits::decode($n, "01");
my $e = Encode::Positive::Digits::encode($d, "01");
ok $n == $e
( run in 0.234 second using v1.01-cache-2.11-cpan-0d8aa00de5b )