use String::Random; my $length = 15; my $Random = new String::Random; my $password = ''; while (length($password) < $length) { my $missing_length = $length - length($password); my $added_string = $Random->randpattern('.' x $missing_length); $password .= $added_string; $password =~ s/[A-Za-z]{3,}|\d{3,}|[^A-Za-z\d]{3,}//; }