my $alphabet = "0123456789ABCDEF"; my %successor = $alphabet =~ /(.)(?=(.))/g; my $zero = substr($alphabet, 0, 1); ... sub genIterator { my($len, $count) = @_; my $cur = ''; my $lastdig = substr($alphabet, $count - 1, 1); return sub { if (length($cur) < $len) { $cur .= $zero; } else { $cur =~ s/([^$lastdig])$lastdig*\z/$successor{$1}/ or $cur = undef; } $cur; } }