TipJar::Template::fill - interpolate data into templates with a minimum of fuss


Define a function that fills templates from a hash in our scope

  use strict; # optional
  our %fill; 
  use TipJar::Template::fill 
  %fill = ... # some code to load variables into %fill
  print fill( <<EOTEM);

        About your issue numbered [ISSUENUMBER] in our tracking system,


       We have reached the following conclusion:


        Thanks for choosing [COMPANYNAME]

        Have a [DAYTYPE] day.

Some templates use a different syntax for their variables, and keep them in hashes with names different than you want for the filling function.

  my %Tvar;
  use TipJar::Template::fill 
       fill => fillXML,   
       hashref => \%Tvar, # this will be the default data source for fillXML(),
                          # instead of %fillXML
       regex => qr{<tvar name="([^"]*)"\s*/>};   

And some of our templates take their data from alternate sources

  use TipJar::Template::fill;
  $fill{musicCDlist} =
       join '</li><li>',
            map {
                  fill($CDlist_item_template, $_)
                 'SELECT * FROM music',
                 {Slice => {}}


TipJar::Template::fill provides an interface to substitution-based filling of templates. That's all it does. Find and replace. No conditionals or looping constructs are provided.


TipJar::Template::fill takes all its configuration on its use line.


the fill argument specifies the name of the subroutine to export. This argument defaults to 'fill'.


the hashref argument specifies the hash to find the data to interpolate into the templates. When not specified, it defaults to a named package hash in the calling package, with the name provided by the fill argument.


the regex argument is either a string or a precompiled regular expression that identifes the variable in the template and captures the variables name.

The default is suitable for interpolating variables appearing in templates in square brackets with names composed of [a-zA-Z0-9_].


by specifying a true _args argument, the behavior of a fill subroutine can be changed on-the-fly, by modifying the %fill_args (or whatever you have fill set to) hash in your package. There is a slight performance penalty for using this feature.


the fill subroutine

TipJar::Template::fill exports one subroutine, called fill by default, that takes one or two arguments. The first argument is the template to be filled, and the second, when provided, is a reference to a hash from which to pull the replacement variables.

The name can be set by specifying a fill use-time argument. It is thus possible to associate different target regular expressions and different variable sources with differently named fill subroutines.


when a use-time argument called '_args' is provided a true value, the resulting fill subroutine will respond to changes made in a %fill_args hash that is exported to the caller's name space, with 'fill' replaced with whatever the fill argument was set to, in case you want to change your interpolation regex on-the-fly, or change the default data source on-the-fly without creating a new fill subroutine.

By default, the regex and the default data source do not change.


There's a TipJar::Template::fill::makesub subroutine, that takes two arguments, a regular expression and a hash reference, and provides an anonymous fill subroutine. If you are of an object-oriented bent, you could consider it the constructor.


A very nice article comparing popular templating systems is available at

Why bother?

Beginners to Perl may not be comfortable with regular expression writing. Perrin Harkins throws away writing a substitution expression at the beginning of his article as something that authors of templating systems start with, yet novice Perl coders who just want data interpolation but are not comfortable with the nuances of Perl's substitution operator are at this time presented with an abundance of object-oriented systems that do far more than they need.

TipJar::Template::fill abstracts repeated similar and visually busy substitution commands into a one-word subroutine. So you don't have to.


Copyright (C) 2005 by David L. Nicol


why TipJar::

TipJar is a service mark of TipJar LLC, a limited liability corporation registered in Missouri, USA, that has been providing practical infrastructure since 1996.