"Selector, Lev Y" <[EMAIL PROTECTED]> wrote:
>Hello,
>I have integer numbers represented in base 36 (each digit may have one of 36
>values: ('0'..'9','A'..'Z')).
>For example: '5BFHK'.
>I need to increment the number by 1 or by some step (for example, by 25).
>Here is my first take on incrementing by 1:
<snip>
POSIX::strtol() can convert base-36 strings to integers, so all one
needs to do is the opposite conversion.
----------------------------------------------------------------------
use POSIX qw(strtol);
use strict;
sub advance {
use integer;
my $instr = shift;
my $num = 1 + strtol($instr, 36);
my $outstr = "";
while ($num > 0) {
$outstr = ('0'..'9','A'..'Z')[$num % 36] . $outstr;
$num /= 36;
}
return $outstr;
}
for (qw(5BFHK 111Z ZZZZ)) { print "\n$_\n",advance($_),"\n"; }
----------------------------------------------------------------------
The only real hint of fun here is the little-used "use integer", which lets
one say "$num /= 36" instead of "$num = int($num / 36)".
Of course, this probably won't work if your base-36 numbers exceed the size
of a C integer.
--Sean