sub iterator { my($n, $b) = @_; my $limit = $b - 1; die "base out of range" unless $limit =~ /^\d$/; my $str; sub { return $str = "0" x $n unless defined $str; return $str =~ s/([^$limit])($limit*)$/($1+1)."0" x length($2)/e ? $str : undef; } } # Usage: my $iterator = iterator(5, 2); while (defined($next = $iterator->())) { print "next: $next\n"; }