my %seen = (); my $carry = ""; my $nextn = 1; sub nexta { my $length = 1; my $forbiddenlength = ($carry eq "") ? length($nextn) : 0; while (1) { if ($length==$forbiddenlength) { $length++; } elsif (length($carry) < $length) { $carry .= $nextn++; } elsif ((not exists $seen{ substr($carry, 0, $length) }) && ( length($carry)==$length || substr($carry, $length, 1) ne "0")) { last; } else { $length++; } } my $a = substr($carry, 0, $length); $seen{$a} = 1; $carry = substr($carry, $length); return $a; } foreach my $n (1..10000) { my $a = nexta(); print "$n $a\n"; }