use strict; BEGIN{eval q{use warnings;}} { my %cache; sub Gimme { my( $arr, $n, $clear, $all ) = @_; my @ret = (); $cache{$arr} = {} if defined $clear or not exists $cache{$arr}; %cache = () if defined $all; while($n){ my $rand = $$arr[rand@$arr]; unless(exists $cache{$arr}{$rand}){ $n--; $cache{$arr}{$rand}++; push @ret, $rand; } if( scalar %{$cache{$arr}} == @$arr ) { warn "No more unique elements left in $arr"; return @ret; } } return @ret; } } my @array = ( 1..10,'a'..'z',keys %:: ); #my($c1, $c2, $c3, $c4, $c5 ) = Gimme(\@array,5); for(1..10){ print "\n\n=head1 $_\n\n"; print "\t$_\n" for Gimme(\@array, 5); } __END__