Here's a sample story file:
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.The [noun] [past_tense_verb] the [noun].
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; }; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
RE: More Mad Libs
by turnstep (Parson) on Apr 19, 2000 at 03:00 UTC | |
by btrott (Parson) on Apr 19, 2000 at 03:09 UTC | |
by turnstep (Parson) on Apr 19, 2000 at 04:19 UTC | |
by Simplicus (Monk) on Apr 19, 2000 at 17:53 UTC |