Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Comment on

( #3333=superdoc: print w/replies, xml ) Need Help??

Changes...

  • Relocated module from RolePlaying name space to Fancy name space.
  • Renamed
    • module from Random to Rand
    • random to fance_rand
    • random_from_list to fancy_rand_from_array (a hash is also a list)
  • Corrected errors seen by others.
  • Added uniq to the flattened hash list so repeated items don't get more weight.

You might wonder why Fancy::Rand. Well, I already have Fancy::Map, Fancy::Splice, Fancy::Split, Fancy::Join::Defined, and Fancy::Join::Grammatical. I decided when I do something "fancy" with a perl function, I will put it in the name space Fancy and name the top subroutine fancy_function. So, now I can add Fancy::Rand and fancy_rand to my list of Fancy::Functions.

Here is the final rough draft. I think I got everything fixed.

package Fancy::Rand; use strict; use warnings FATAL => qw(all); use Exporter qw(import); our @EXPORT_OK = qw(fancy_rand fancy_rand_from_array tiny_rand instant +_rand); use List::Util qw(shuffle uniq); sub fancy_rand { my ($list, $user_input, $opt) = @_; my $random_item; if ($user_input && $user_input =~ /(?:help|options)/) { my $keys = join("\n ", sort keys %{$list}); $random_item = "Your options are: $keys by keys: get a random key all: get a random item from any key on the list keys: get the list of the keys data: get the whole hash"; } elsif ($user_input && $user_input eq 'data') { $random_item = $list; } elsif ($user_input && $user_input eq 'keys') { $random_item = [keys %$list]; } else { my @random_list; if ($user_input && $user_input eq 'by keys') { @random_list = keys %{$list}; } elsif (!$user_input || $user_input eq 'all' ) { @random_list = uniq(map { @$_ } values %{$list}); } elsif ($list->{$user_input}) { @random_list = @{$list->{$user_input}}; } else { my $caller = $opt->{caller} ? " in ".$opt->{caller} : 'fancy_ran +d'; die "Your option '$user_input' is not a list $caller.\n\tStopped +$!" } push @random_list, @{$opt->{'additions'}} if $opt->{'additions'}; @random_list = shuffle(@random_list); $random_item = $random_list[rand @random_list]; } return $random_item; } sub fancy_rand_from_array { my @rand_array = shuffle(@_); return $rand_array[rand @rand_array]; } sub tiny_rand { fancy_rand_from_array(@_); } sub instant_rand { fancy_rand_from_array(@_); } =head1 NAME B<Fancy::Rand> selects random items from sets of lists. =head1 SYNOPSIS use Fancy::Rand qw(fancy_rand fancy_rand_from_array tiny_rand instan +t_rand); my $random_thing = fancy_rand($hash_of_arrays, $selected_list, { add +itions => [@additional_items], caller => $caller }); my $fancy_rand_from_array = fancy_rand_from_array(qw(red yellow gree +n cyan blue magenta black white)); =head1 DESCRIPTION B<Fancy::Rand> has two tools to help you select where your randomness +comes from: C<fancy_rand> and C<fancy_rand_from_array>. =head2 fancy_rand C<fancy_rand> takes a hash of arrays and returns a random result based + on the list selected from the hash. It is meant to be used in the cr +eation of other random subroutines. my %colors = ( 'general' => [qw(red yellow green cyan blue magenta white black gr +ay)] 'eye' => [qw(amber black blue brown gray green hazel red violet)] +, 'hair' => [qw(auburn brown black blond gray red white)], 'rainbow' => [qw(red orange yellow green blue indigo violet)], ); sub random_color { my ($selected_color_key, $color_additions) = @_; fancy_rand(\%colors, $selected_color_key, { additions => $color_a +dditions, caller => 'random_color' }); } =head3 Selections =head4 all or nothing When C<all> or C<undef> is selected or nothing is entered, C<random> w +ill flatten the hash and return any value from the hash. Using C<fancy_rand> by itself: my $random_color_one = fancy_rand(\%colors); my $random_color_two = fancy_rand(\%colors, undef); my $random_color_all = fancy_rand(\%colors, 'all'); Using the newly created C<random_color>: my $random_color_one = random_color(); my $random_color_two = random_color(undef); my $random_color_all = random_color('all'); All of the above will return any color in the hair, eye, and rainbow l +ists. =head4 a key When a specific key is selected, C<fancy_rand> will return an item fro +m the selected key. Using C<fancy_rand> by itself: my $random_hair_color = fancy_rand(\%colors, 'hair'); my $random_eyes_color = fancy_rand(\%colors, 'eye'); Using the newly created C<random_color>: my $random_hair_color = random_color('hair'); my $random_eyes_color = random_color('eye'); =head4 by keys When C<by keys> is selected, C<fancy_rand> will return a random key. Using C<fancy_rand> by itself: my $random_color_key = fancy_rand(\%colors, 'by keys'); Using the newly created C<random_color>: my $random_color_key = random_color('by keys'); Both of the above will return a random key from C<%colors>: hair, eye, + rainbow. =head4 keys When C<keys> is selected, C<fancy_rand> will return the list of keys f +rom the hash to help remind you of your key options. Using C<fancy_rand> by itself: my $random_color_keys = fancy_rand(\%colors, 'keys'); Using the newly created C<random_color>: my $random_color_keys = random_color('keys'); Both of the above will return a list of the keys: C<['hair', 'eye', 'r +ainbow']>. =head4 data When C<data> is selected, C<fancy_rand> will return the entire hash so + you can refresh your memory of what is in the hash. Using C<fancy_rand> by itself: my $random_color_data = fancy_rand(\%colors, 'data'); Using the newly created C<random_color>: my $random_color_data = random_color('data'); =head4 help or options When C<help> or C<options> is selected, all of your options will be li +sted. Using C<fancy_rand> by itself: my $random_color_help = fancy_rand(\%colors, 'help'); my $random_color_opts = fancy_rand(\%colors, 'options'); Using the newly created C<random_color>: my $random_color_help = random_color('help'); my $random_color_opts = random_color('options'); =head3 Optional parameters There are two optional parameters you can use, C<additions> and C<call +er>. =head4 additions C<additions> is a list that you want to add to the list you have alrea +dy selected. You might want to add the colors pink, blue, and purple to the choices + of hair color or yellow and bloodshot to eye color. Using C<fancy_rand> by itself: my $random_hair_color = fancy_rand(\%colors, 'hair', { additions => +[qw(pink purple blue)] }); my $random_eyes_color = fancy_rand(\%colors, 'eye', { additions => +[qw(yellow bloodshot)] }); Using the newly created C<random_color>: my $random_hair_color = random_color('hair', [qw(pink purple blue)]) +; my $random_eyes_color = random_color('eye', [qw(yellow bloodshot)]) +; =head4 caller C<caller> can be used to create an error message with the specific sub +routine your are using random in. Using C<fancy_rand> by itself: my $random_color = fancy_rand(\%colors, 'rainboe', { caller => 'rand +om_color' }); Using the newly created C<random_color>: my $random_color = random_color('rainboe'); If the user selects a list that will not produce a result, the error m +essage from both of the above will read as follows. Your option 'rainboe' is not a list in random_color. Stopped at ... =head2 fancy_rand_from_array C<fancy_rand_from_array> takes an array and returns a random result. C +<tiny_rand> and C<instant_rand> are aliases for C<fancy_rand_from_arr +ay>. my $fancy_rand_from_array = fancy_rand_from_array(qw(black white red + yellow green cyan blue magenta)); my $tiny_rand = tiny_rand(qw(black white)); my $instant_rand = instant_rand(qw(red yellow green cyan blue magent +a)); =head1 AUTHOR Lady Aleena =cut 1;
No matter how hysterical I get, my problems are not time sensitive. So, relax, have a cookie, and a very nice day!
Lady Aleena

In reply to Re^2: RFC: Proofread POD for my main random module, please? (more) by Lady_Aleena
in thread RFC: Proofread POD for my main random module, please? (more) by Lady_Aleena

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and all is quiet...

    How do I use this? | Other CB clients
    Other Users?
    Others browsing the Monastery: (3)
    As of 2018-07-19 00:33 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?
      It has been suggested to rename Perl 6 in order to boost its marketing potential. Which name would you prefer?















      Results (398 votes). Check out past polls.

      Notices?