use strict; use warnings; use List::Util qw(shuffle); sub gen_password { my $password; my $minlength = 8; my $maxlength = 12; my $minclasses = 3; my $other = rand($maxlength-$minlength) + $minlength - $minclasses; my @classes = ( ['a' .. 'z'], ['A' .. 'Z'], [0 .. 9], [qw( . ! / \ - : ; " ' ? $ ^ & @ [ ] = + | < > % * ~ ) , qw/ ( ) /, ',', '#'], ); my @required = shuffle(0 .. $#classes); my @indexes = shuffle(@required[ map { rand @required } (1 .. $other) ], @required[0 .. ($minclasses - 1)]); foreach my $i (@indexes) { $password .= @{$classes[$i]}[rand @{$classes[$i]}]; } return $password; }