Which of the following perl subroutines to generate a random password is the most readable to you?
sub passwd { my @c = ('a'..'z','A'..'Z', 0 .. 9, qw|! @ # $ % ^ & * ( )| ); return join '', map { $c[rand($#c)] } ( 1 .. $_[0] ); } sub passwd { my @c = ('a'..'z','A'..'Z', 0 .. 9, qw|! @ # $ % ^ & * ( )| ); $_[0] == 0 and return; $_[0] > 0 and do { return $c[rand($#c)] . passwd( $_[0] - 1 ); }; } sub passwd { my @c = ('a'..'z','A'..'Z', 0 .. 9, qw|! @ # $ % ^ & * ( )| ); my $passwd; for (my $i=0; $i<$_[0]; $i++) { $passwd .= $c[rand($#c)]; } return $passwd; } sub passwd { my @c = ('a'..'z','A'..'Z', 0 .. 9, qw|! @ # $ % ^ & * ( )| ); my $passwd; while ( length($passwd) < $_[0] ) { $passwd .= $c[rand($#c)]; } return $passwd; }One is perlish, one is Haskellish, and the last two are C-ish. Or is there a better way?
sub passwd { my @c = ('a'..'z','A'..'Z', 0 .. 9, qw|! @ # $ % ^ & * ( )| ); return join '', @c[map{rand @c} 1 .. $_[0]]; }I only point this out because it uses slightly less punctuation than your first version. That and it is nice that 'rand @c' works instead of 'rand $#c' - Mark Hershberger (hexmode.com)