Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Re: Text::Template

by PotPieMan (Hermit)
on Oct 23, 2001 at 03:49 UTC ( [id://120659] : note . print w/replies, xml ) Need Help??

in reply to Text::Template

A couple of warnings on the use of Text::Template. If you use strict like a good Perl programmer, Text::Template will not see your variables as you might expect. Since templates are opened in new scopes by Text::Template, this behavior makes perfect sense, but is rather annoying.

You have two options available when you run into this problem:

  1. As mirod mentions, declare and initialize your variables in a separate package. Personally, I don't think this is very elegant.
  2. Pass your Text::Template object a hash reference with the variables to replace. On the plus side, this allows you to control what information is available to templates. On the minus side, you have to go to the trouble of building another hash. (Of course, if you've already built it, then this isn't an issue.)
Truthfully, neither option is that much of a problem in most situations. Just be aware.

Also, I found that Text::Template doesn't behave exactly as you might expect in dereferencing variables. For instance, take the following code as an example:

my %vars = ('measurements' => {'temperature' => {'current' => '22 degC +', 'high' => '26 degC', 'low' => '18 degC' }, 'humidity' => '82%' }, 'time' => scalar(localtime) ); my $tt = Text::Template->new(SOURCE => $templateFile) or die "Couldn't + construct template: $Text::Template::ERROR"; my $weather = $tt->fill_in(HASH => \%vars);
Assuming your template delimiters are the default ({ and }), you might expect to use {$measurements->{'temperature'}->{'current'}} to print the current temperature in your template. I had to use {$measurements{'temperature'}{'current'}} instead, and I'm not entirely sure why. (If any monks have an idea, please let me know.) This was with version 1.41 (current as of 2001-10-22); I have emailed the author with the question and am awaiting a response.

With all that said, Text::Template is a great module for removing more of the display element from your code. For my scripts, I probably would have gone with either HTML::Template or Template Toolkit if they had been readily available.

Update: I overlooked one important section of the documentation. As Dominus politely pointed out in an email, the HASH section explains how the templates are filled. Indeed,

If the value is a reference to an array, then @key is set to that array. If the value is a reference to a hash, then %key is set to that hash. Similarly if value is any other kind of reference.
I always manage to miss the important parts of documentation. :-)