in reply to Handling elements of an array of array references, where the function calls for an array?

Silly idea but, as you say, the decision is out of you hands :-(

Set up the four sets already shuffled then make an array of references to them. Then create another array with a guaranteed one from each set (0 .. 3) then a random selection of four more from any set. Then shuffle the order. Finally, build the password by concatenating random letters from the sets in the already shuffled order.

knoppix@Microknoppix:~$ perl -MList::Util=shuffle -Mstrict -wE ' my @lc = shuffle q{a} .. q{z}; my @uc = shuffle q{A} .. q{Z}; my @dig = shuffle q{0} .. q{9}; my @oth = shuffle qw{ ! " £ $ % ^ & * _ - + = @ ~ }; my @all = \ ( @lc, @uc, @dig, @oth ); my @order = ( 0 .. 3 ); push @order, int rand 4 for 1 .. 4; @order = shuffle @order; my $passwd = q{}; $passwd .= $all[ $_ ]->[ rand @{ $all[ $_ ] } ] for @order; say $passwd;' E5yR=$%£ knoppix@Microknoppix:~$

Runs of this have produced &D0%@nn%, F9@F=Rc1, S~j@3WgG, 633P£m!T and o8S4pl!! so, as long as there is no stipulation barring repeated characters, this seems to work.

I hope this is useful.

Update: If repeated characters are not wanted then you can use splice to remove the chosen character from the array so it can't be re-used.

... $passwd .= splice @{ $all[ $_ ] }, rand @{ $all[ $_ ] }, 1 for @order; ...

Cheers,

JohnGG

  • Comment on Re: Handling elements of an array of array references, where the function calls for an array?
  • Select or Download Code

Replies are listed 'Best First'.
Re^2: Handling elements of an array of array references, where the function calls for an array?
by desertrat (Sexton) on May 14, 2012 at 23:49 UTC

    I think I see the way now, thank you to all for your help. I realize now that I completely neglected to mention that this was not the intended end function, but a test just to make sure I was getting some of all of them!