#!/usr/local/bin/perl -w use strict; die "usage: $0 " 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 = ; chomp $word; $word; }; }