$val = 'BB'; incr($val); ==> 'BC' $val = 'BZ'; incr($val); ==> 'CB'; $val = 'ZZ'; incr($val) ==> 'BBB'; #### use 5.010; use strict; use warnings; my $x = 'ZX'; for my $i ( 1 .. 100 ) { $x = incra($x); say $x; } sub incra { my $val = shift or die "Where's my value?"; $val = reverse $val; # easier to think left to right my $digits = 'BCDFGHJKLMNPQRSTVWXZ'; my $ndigits = length $digits; my $carry_in = 1; my $result = ''; for my $digit ( split //, $val ) { my $i = index $digits, $digit; if ($carry_in) { if ( $i == $ndigits - 1 ) { $digit = substr $digits, 0, 1; } else { $digit = substr $digits, $i + 1, 1; $carry_in = 0; } } $result .= $digit; } $result .= substr $digits, 0, 1 if $carry_in; return reverse $result; }