use List::Util qw( shuffle ); my @passwd; push @passwd, $letters[ rand(@letters) ] for 1..$num_letters; push @passwd, $digits[ rand(@digits ) ] for 1..$num_digits; push @passwd, $symbols[ rand(@symbols) ] for 1..$num_symbols; push @passwd, $chars[ rand(@chars) ] for 1..($length-$num_letters-$num_digits-$num_symbols); my $passwd = join '', shuffle @passwd;