Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??
This is yet another rewrite of the mad libs script much discussed last week: An Elegance Question. DISCLAIMER: the point of this is not to give you code that you should use. All the same, though, it's quite fun, and if you try to figure out what's going on, it's pretty educational.

Here's a sample story file:

The [noun] [past_tense_verb] the [noun].
You don't have to predeclare anything; the code will prompt you for the parts of speech that it needs, automatically. One bad thing is that said parts of speech must be valid Perl identifiers.

But then again, this *is* just for fun. :)

#!/usr/local/bin/perl -w use strict; die "usage: $0 <madlib>" unless @ARGV; my @story = <>; # Set up the Text::Template normally. use Text::Template; my $t = new Text::Template(TYPE => 'ARRAY', SOURCE => [ @story ], DELIMITERS => ['[', ']']); # compile the template; usually you don't need to # call this, cause it gets called automatically. # but we need to do some magic on its results. $t->compile; # This is magical. :) # Mark-Jason Dominus probably wouldn't like me # messing with the insides of his module. This # extracts all of the template variables and # creates closures for each, then sticks # all of that into a hash. my %hash = map { $_->[1], mk_subref($_->[1]) } grep $_->[0] eq "PROG", @{$t->{SOURCE}}; # Now we fill in the story, and we're done: # we hand Text::Template the hash we've # constructed. Each time it finds one of the # template variables (in the template itself), # it (magically) calls the closure we associated # with it, which prompts the user and returns # the word he/she entered; which is then filled # into the template. my $story = $t->fill_in(HASH => \%hash); print $story; # Returns a closure that prompts the user for a part # of speech, then returns the word he/she enters sub mk_subref { my $part = shift; return sub { print "Give me a $part: "; my $word = <STDIN>; chomp $word; $word; }; }

In reply to More Mad Libs by btrott

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



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (4)
As of 2024-04-19 04:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found