c:\@Work\Perl\monks>perl -le "use warnings; use strict; ;; use List::Util qw{ shuffle }; ;; sub shuf_shuf_2_from_each (\@;\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@); ;; my @acc = qw( AX1 AX2 AX3 ); my @sec = qw( PB6 PB7 PB8 ); my @third = qw( XC2 XC8 XC1 ); ;; my %option = ( 1 => sub { return shuf_shuf_2_from_each @acc; }, 2 => sub { return shuf_shuf_2_from_each @acc, @sec; }, 3 => sub { return shuf_shuf_2_from_each @acc, @third; }, 4 => sub { return shuf_shuf_2_from_each @acc, @sec, @third; }, ); ;; for my $opt (1 .. 4) { my @selected = $option{$opt}->(); print qq{option $opt: @selected}; } ;; ;; sub shuf_shuf_2_from_each (\@;\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@) { return shuffle map { (shuffle @$_)[0,1] } @_; } " option 1: AX1 AX2 option 2: PB8 AX3 PB7 AX1 option 3: XC8 AX3 AX1 XC2 option 4: XC2 PB8 AX2 PB7 XC8 AX3 #### my %option = ( 1 => [ \ @acc ], 2 => [ \(@acc, @sec) ], 3 => [ \(@acc, @third) ], 4 => [ \(@acc, @sec, @third) ], ); ... my $opt = whatever(); my @selected = shuf_shuf_2_from_each($option{$opt}); ... sub shuf_shuf_2_from_each { my ($ar_input_arrays) = @_; return shuffle map { (shuffle @$_)[0,1] } @$ar_input_arrays; }