use List::Util qw(shuffle); sub random { my ($user_input, $list) = @_; $list->{'all'} = [ map { @$_ } values %{$list} ]; $list->{'keys'} = [ grep {$_ !~ /(?:all|keys)/} keys %{$list} ]; if ($user_input && $user_input =~ /(?:help|options)/) { return 'Your options are: '.join(', ',sort @{$$list{'keys'}}).', or all.'; } elsif ($user_input && $user_input =~ /dump/) { use Data::Dumper; return Dumper($list); } else { my $input = $user_input ? $user_input : 'all'; my @random_list = shuffle(@{$$list{$input}}); return $random_list[rand @random_list]; } } #### my %waters = ( running => [qw(spring streamlet rivulet run brook creek stream river)], standing => [qw(drop puddle pool pond lake sea ocean)], precipitation => [qw(rain snow sleet hail)] ); sub random_water { my ($user_water) = @_; random($user_water, \%waters); } #### print random_water('dump'); $VAR1 = { 'keys' => [ 'standing', 'precipitation', 'running' ], 'standing' => [ 'drop', 'puddle', 'pool', 'pond', 'lake', 'sea', 'ocean' ], 'precipitation' => [ 'rain', 'snow', 'sleet', 'hail' ], 'running' => [ 'spring', 'streamlet', 'rivulet', 'run', 'brook', 'creek', 'stream', 'river' ], 'all' => [ 'drop', 'puddle', 'pool', 'pond', 'lake', 'sea', 'ocean', 'rain', 'snow', 'sleet', 'hail', 'spring', 'streamlet', 'rivulet', 'run', 'brook', 'creek', 'stream', 'river' ] }; #### print random_water('dump'); print random_water('dump'); $VAR1 = { 'keys' => [ 'standing', 'precipitation', 'running' ], 'standing' => [ 'drop', 'puddle', 'pool', 'pond', 'lake', 'sea', 'ocean' ], 'precipitation' => [ 'rain', 'snow', 'sleet', 'hail' ], 'running' => [ 'spring', 'streamlet', 'rivulet', 'run', 'brook', 'creek', 'stream', 'river' ], 'all' => [ 'standing', 'precipitation', 'running', 'drop', 'puddle', 'pool', 'pond', 'lake', 'sea', 'ocean', 'rain', 'snow', 'sleet', 'hail', 'spring', 'streamlet', 'rivulet', 'run', 'brook', 'creek', 'stream', 'river', 'drop', 'puddle', 'pool', 'pond', 'lake', 'sea', 'ocean', 'rain', 'snow', 'sleet', 'hail', 'spring', 'streamlet', 'rivulet', 'run', 'brook', 'creek', 'stream', 'river' ] };