stan_b has asked for the wisdom of the Perl Monks concerning the following question:

Greetings,

A time ago I've been using my own simple template library that had a feature allowing to define some variable in the template, retrieve it from script and then replace this variable with some value.

For example, if user defines in a template a string "%section_10%" I retrieve value "10", make a mySQL query to select some text from row with id = 10 and then replace text "%section_10%" with query result.

Now I want to move to some other template engine that is probably more optimised then mine own, but I cannot find anything. I have looked for HTML::Template and CTPP but it seems that they don't allow to define variable value in the template and retrive it.

Can someone point me to the template library that has the functionality I need?

Thanks in advance.

Replies are listed 'Best First'.
Re: Template engine question
by moritz (Cardinal) on Dec 06, 2009 at 21:30 UTC
    It seems that what you want is normally formulated as a callback: instead of a variable %section_10% you should look for a mechanism to call a subroutine: [% section(10) %] or so.

    I don't know offhand which template modules support that mechanism, but maybe Reverse Callback Templating might be of interest to you.

Re: Template engine question
by GrandFather (Saint) on Dec 06, 2009 at 20:54 UTC

    Unless someone else has come up with exactly the templating scheme you are using (which is rather unlikely), you are going to have to adjust your template documents somewhat. However that needn't be much and there are plenty of templating engines around that are happy dealing with plain text. For example, with HTML::Template you could:

    use strict; use warnings; use HTML::Template; my $str = <<STR; For example, if user defines in a template a string "%section_10%" I r +etrieve value "10", make a mySQL query to select some text from row with id = +10 and then replace text with query result "<!-- TMPL_VAR "section_10" -->". STR my @db = ('', qw(the quick brow fox jumps over the lazy dog should suf +fice)); my $template = HTML::Template->new (scalarref => \$str); my %usedParams = map {lc ($_) => 1} $template->param (); my @usedIds = map {m/section_(\d+)/; $1} keys %usedParams; $template->param ("section_$_" => $db[$_]) for grep {defined $_ && length $db[$_]} @usedIds; print $template->output ();

    Prints:

    For example, if user defines in a template a string "%section_10%" I r +etrieve value "10", make a mySQL query to select some text from row with id = +10 and then replace text with query result "should".

    Which recognizes your variable pattern, extracts the index, performs the look up, then reconstitutes the variable to apply the value in the template.


    True laziness is hard work
Re: Template engine question
by zwon (Abbot) on Dec 06, 2009 at 20:52 UTC

    Not exactly as you want, but Template::Toolkit allows you to make SQL query directly from your template.

Re: Template engine question
by CountZero (Bishop) on Dec 07, 2009 at 06:12 UTC
    Template::Toolkit allows you to define your own plugins which can define new functions or methods. See Template::Plugin for more information.

    CountZero

    A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James