1Template::Manual::VariaUbsleers(C3o)ntributed Perl DocumTeenmtpaltaitoen::Manual::Variables(3)
2
3
4

NAME

6       Template::Manual::Variables - Template variables and code bindings
7

DESCRIPTION

9       Template Variables
10
11       A reference to a hash array may be passed as the second argument to the
12       process() method, containing definitions of template variables.  The
13       VARIABLES (a.k.a. PRE_DEFINE) option can also be used to pre-define
14       variables for all templates processed by the object.
15
16           my $tt = Template->new({
17               VARIABLES => {
18                   version => 3.14,
19                   release => 'Sahara',
20               },
21           });
22
23           my $vars = {
24               serial_no => 271828,
25           };
26
27           $tt->process('myfile', $vars);
28
29       'myfile':
30
31           This is version [% version %] ([% release %]).
32           Serial number: [% serial_no %]
33
34       output:
35
36           This is version 3.14 (Sahara)
37           Serial number: 271828
38
39       Variable names may contain any alphanumeric characters or underscores.
40       They may be lower, upper or mixed case although the usual convention is
41       to use lower case.  The case is significant however, and 'foo', 'Foo'
42       and 'FOO' are all different variables.  Upper case variable names are
43       permitted, but not recommended due to a possible conflict with an
44       existing or future reserved word.  As of version 2.00, these are:
45
46               GET CALL SET DEFAULT INSERT INCLUDE PROCESS WRAPPER
47           IF UNLESS ELSE ELSIF FOR FOREACH WHILE SWITCH CASE
48           USE PLUGIN FILTER MACRO PERL RAWPERL BLOCK META
49           TRY THROW CATCH FINAL NEXT LAST BREAK RETURN STOP
50           CLEAR TO STEP AND OR NOT MOD DIV END
51
52       The variable values may be of virtually any Perl type, including simple
53       scalars, references to lists, hash arrays, subroutines or objects.  The
54       Template Toolkit will automatically apply the correct procedure to
55       accessing these values as they are used in the template.
56
57       Example:
58
59           my $vars = {
60               article => 'The Third Shoe',
61               person  => {
62                   id    => 314,
63                   name  => 'Mr. Blue',
64                   email => 'blue@nowhere.org',
65               },
66               primes  => [ 2, 3, 5, 7, 11, 13 ],
67               wizard  => sub { return join(' ', 'Abracadabra!', @_) },
68               cgi     => CGI->new('mode=submit&debug=1'),
69           };
70
71       template:
72
73           [% article %]
74
75           [% person.id %]: [% person.name %] <[% person.email %]>
76
77           [% primes.first %] - [% primes.last %], including [% primes.3 %]
78           [% primes.size %] prime numbers: [% primes.join(', ') %]
79
80           [% wizard %]
81           [% wizard('Hocus Pocus!') %]
82
83           [% cgi.param('mode') %]
84
85       output:
86
87           The Third Shoe
88
89           314: Mr. Blue <blue@nowhere.org>
90
91           2 - 13, including 7
92           6 prime numbers: 2, 3, 5, 7, 11, 13
93
94           Abracadabra!
95           Abracadabra! Hocus Pocus!
96
97           submit
98
99       Scalar Values
100
101       Regular scalar variables are accessed by simply specifying their name.
102       As these are just entries in the top-level variable hash they can be
103       considered special cases of hash array referencing as described below,
104       with the main namespace hash automatically implied.
105
106           [% article %]
107
108       Hash Array References
109
110       Members of hash arrays are accessed by specifying the hash reference
111       and key separated by the dot '.' operator.
112
113           my $vars = {
114               'home' => 'http://www.myserver.com/homepage.html',
115               'page' => {
116                   'this' => 'mypage.html',
117                   'next' => 'nextpage.html',
118                   'prev' => 'prevpage.html',
119               },
120           };
121
122       template:
123
124           <a href="[% home %]">Home</a>
125           <a href="[% page.prev %]">Previous Page</a>
126           <a href="[% page.next %]">Next Page</a>
127
128       output:
129
130           <a href="http://www.myserver.com/homepage.html">Home</a>
131           <a href="prevpage.html">Previous Page</a>
132           <a href="nextpage.html">Next Page</a>
133
134       Any key in a hash which starts with a '_' or '.' character will be con‐
135       sidered private and cannot be evaluated or updated from within a tem‐
136       plate.  The undefined value will be returned for any such variable
137       accessed which the Template Toolkit will silently ignore (unless the
138       DEBUG option is enabled).
139
140           my $vars = {
141           message => 'Hello World!',
142           _secret => "On the Internet, no-one knows you're a dog",
143           thing   => {
144                public  => 123,
145               _private => 456,
146              '.hidden' => 789,
147           },
148           };
149
150       template:
151
152           [% message %]       # outputs "Hello World!"
153           [% _secret %]               # no output
154           [% thing.public %]          # outputs "123"
155           [% thing._private %]        # no output
156           [% thing..hidden %]         # ERROR: unexpected token (..)
157
158       You can disable this feature by setting the $Template::Stash::PRIVATE
159       package variable to a false value.
160
161           $Template::Stash::PRIVATE = undef;   # now you can thing._private
162
163       To access a hash entry using a key stored in another variable, prefix
164       the key variable with '$' to have it interpolated before use (see
165       "Variable Interpolation").
166
167           [% pagename = 'next' %]
168           [% page.$pagename %]       # same as [% page.next %]
169
170       When you assign to a variable that contains multiple namespace elements
171       (i.e. it has one or more '.' characters in the name), any hashes
172       required to represent intermediate namespaces will be created automati‐
173       cally.  In this following example, the 'product' variable automatically
174       springs into life as a hash array unless otherwise defined.
175
176           [% product.id    = 'XYZ-2000'
177              product.desc  = 'Bogon Generator'
178              product.price = 666
179           %]
180
181           The [% product.id %] [% product.desc %]
182           costs $[% product.price %].00
183
184       output:
185
186           The XYZ-2000 Bogon Generator
187           costs $666.00
188
189       You can use Perl's familiar '{' ... '}' construct to explicitly create
190       a hash and assign it to a variable.  Note that commas are optional
191       between key/value pairs and '=' can be used in place of '=>'.
192
193           [% product = {
194            id    => 'XYZ-2000',
195            desc  => 'Bogon Generator',
196            price => 666,
197              }
198           %]
199
200       List References
201
202       Items in lists are also accessed by use of the dot operator.
203
204           my $vars = {
205           'people' => [ 'Tom', 'Dick', 'Larry' ],
206           };
207
208       template:
209
210           [% people.0 %]          # Tom
211           [% people.1 %]          # Dick
212           [% people.2 %]          # Larry
213
214       The FOREACH directive can be used to iterate through items in a list.
215
216           [% FOREACH person = people %]
217           Hello [% person %]
218           [% END %]
219
220       output:
221
222           Hello Tom
223           Hello Dick
224           Hello Larry
225
226       Lists can be constructed in-situ using the regular anonymous list '['
227       ... ']' construct.  Commas between items are optional.
228
229           [% cols = [ 'red', 'green', 'blue' ] %]
230
231           [% FOREACH c = cols %]
232              ...
233
234       or:
235
236           [% FOREACH c = [ 'red', 'green', 'blue' ] %]
237              ...
238
239       You can also create simple numerical sequences using the familiar '..'
240       operator:
241
242           [% n = [ 1 .. 4 ] %]    # n is [ 1, 2, 3, 4 ]
243
244           [% x = 4
245              y = 8
246              z = [x..y]           # z is [ 4, 5, 6, 7, 8 ]
247           %]
248
249       Subroutines
250
251       Template variables can contain references to Perl subroutines.  When
252       the variable is used, the Template Toolkit will automatically call the
253       subroutine, passing any additional arguments specified.  The return
254       value from the subroutine is used as the variable value and inserted
255       into the document output.
256
257           my $vars = {
258           wizard  => sub { return join(' ', 'Abracadabra!', @_) },
259           };
260
261       template:
262
263           [% wizard %]            # Abracadabra!
264           [% wizard('Hocus Pocus!') %]    # Abracadabra! Hocus Pocus!
265
266       Objects
267
268       Template variables can also contain references to Perl objects.  Meth‐
269       ods are called using the dot operator to specify the method against the
270       object variable.  Additional arguments can be specified as with subrou‐
271       tines.
272
273           use CGI;
274
275           ...
276
277           my $vars = {
278           # hard coded CGI params for purpose of example
279           cgi  => CGI->new('mode=submit&debug=1'),
280           };
281
282       template:
283
284           [% FOREACH p = cgi.param %]     # returns list of param keys
285           [% p %] => [% cgi.param(p) %]   # fetch each param value
286           [% END %]
287
288       output:
289
290           mode => submit
291           debug => 1
292
293       Object methods can also be called as lvalues.  That is, they can appear
294       on the left side of an assignment.  The method will be called passing
295       the assigning value as an argument.
296
297           [% myobj.method = 10 %]
298
299       equivalent to:
300
301           [% myobj.method(10) %]
302
303       Parameters and Return Values
304
305       Subroutines and methods will be passed any arguments specified in the
306       template.  Any template variables in the argument list will first be
307       evaluated and their resultant values passed to the code.
308
309           my $vars = {
310           mycode => sub { return 'received ' . join(', ', @_) },
311           };
312
313       template:
314
315           [% foo = 10 %]
316           [% mycode(foo, 20) %]       # received 10, 20
317
318       Named parameters may also be specified.  These are automatically col‐
319       lected into a single hash array which is passed by reference as the
320       last parameter to the sub-routine.  Named parameters can be specified
321       using either '=>' or '=' and can appear anywhere in the argument list.
322
323           my $vars = {
324           myjoin => \&myjoin,
325           };
326
327           sub myjoin {
328           # look for hash ref as last argument
329           my $params = ref $_[-1] eq 'HASH' ? pop : { };
330           return join($params->{ joint } ⎪⎪ ' + ', @_);
331           }
332
333       template:
334
335           [% myjoin(10, 20, 30) %]
336           [% myjoin(10, 20, 30, joint = ' - ' %]
337           [% myjoin(joint => ' * ', 10, 20, 30 %]
338
339       output:
340
341           10 + 20 + 30
342           10 - 20 - 30
343           10 * 20 * 30
344
345       Parenthesised parameters may be added to any element of a variable, not
346       just those that are bound to code or object methods.  At present,
347       parameters will be ignored if the variable isn't "callable" but are
348       supported for future extensions.  Think of them as "hints" to that
349       variable, rather than just arguments passed to a function.
350
351           [% r = 'Romeo' %]
352           [% r(100, 99, s, t, v) %]       # outputs "Romeo"
353
354       User code should return a value for the variable it represents. This
355       can be any of the Perl data types described above: a scalar, or refer‐
356       ence to a list, hash, subroutine or object.  Where code returns a list
357       of multiple values the items will automatically be folded into a list
358       reference which can be accessed as per normal.
359
360           my $vars = {
361           # either is OK, first is recommended
362           items1 => sub { return [ 'foo', 'bar', 'baz' ] },
363           items2 => sub { return ( 'foo', 'bar', 'baz' ) },
364           };
365
366       template:
367
368           [% FOREACH i = items1 %]
369              ...
370           [% END %]
371
372           [% FOREACH i = items2 %]
373              ...
374           [% END %]
375
376       Error Handling
377
378       Errors can be reported from user code by calling die().  Errors raised
379       in this way are caught by the Template Toolkit and converted to struc‐
380       tured exceptions which can be handled from within the template.  A ref‐
381       erence to the exception object is then available as the 'error' vari‐
382       able.
383
384           my $vars = {
385           barf => sub {
386               die "a sick error has occurred\n";
387           },
388           };
389
390       template:
391
392           [% TRY %]
393              [% barf %]       # calls sub which throws error via die()
394           [% CATCH %]
395              [% error.info %]     # outputs "a sick error has occurred\n"
396           [% END %]
397
398       Error messages thrown via die() are converted to exceptions of type
399       'undef'.  Exceptions of user-defined types can be thrown by calling
400       die() with a reference to a Template::Exception object.
401
402           use Template::Exception;
403
404           ...
405
406           my $vars = {
407           login => sub {
408               ...
409               die Template::Exception->new('badpwd',
410                            'password too silly');
411           },
412           };
413
414       template:
415
416           [% TRY %]
417              [% login %]
418           [% CATCH badpwd %]
419              Bad password: [% error.info %]
420           [% CATCH %]
421              Some other '[% error.type %]' error: [% error.info %]
422           [% END %]
423
424       The exception types 'stop' and 'return' are used to implement the STOP
425       and RETURN directives.  Throwing an exception as:
426
427           die (Template::Exception->new('stop'));
428
429       has the same effect as the directive:
430
431           [% STOP %]
432
433       Subroutines and methods can also raise errors by returning a list or
434       reference to a list containing the undefined value (undef) followed by
435       an exception object or error message.  This is supported for backwards
436       compatibility with version 1 but may be deprecated in some future ver‐
437       sion.
438
439           my $vars = {
440           # currently equivalent
441           barf => sub {
442               die "I'm sorry Dave, I can't do that";
443           },
444           yack => sub {
445               return (undef, "I'm sorry Dave, I can't do that");
446           },
447           };
448
449       Virtual Methods
450
451       The Template Toolkit implements a number of "virtual methods" which can
452       be applied to scalars, hashes or lists.  For example:
453
454           [% mylist = [ 'foo', 'bar', 'baz' ] %]
455           [% newlist = mylist.sort %]
456
457       Here 'mylist' is a regular reference to a list, and 'sort' is a virtual
458       method that returns a new list of the items in sorted order.  You can
459       chain multiple virtual methods together.  For example:
460
461           [% mylist.sort.join(', ') %]
462
463       Here the 'join' virtual method is called to join the sorted list into a
464       single string, generating the following output:
465
466           bar, baz, foo
467
468       See Template::Manual::VMethods for details of all the virtual methods
469       available.
470
471       Variable Interpolation
472
473       The Template Toolkit uses '$' consistently to indicate that a variable
474       should be interpolated in position.  Most frequently, you see this in
475       double-quoted strings:
476
477           [% fullname = "$honorific $firstname $surname" %]
478
479       Or embedded in plain text when the INTERPOLATE option is set:
480
481           Dear $honorific $firstname $surname,
482
483       The same rules apply within directives.  If a variable is prefixed with
484       a '$' then it is replaced with its value before being used.  The most
485       common use is to retrieve an element from a hash where the key is
486       stored in a variable.
487
488           [% uid = 'abw' %]
489           [% userlist.$uid %]         # same as 'userlist.abw'
490
491       Curly braces can be used to delimit interpolated variable names where
492       necessary.
493
494           [% userlist.${me.id}.name %]
495
496       Directives such as INCLUDE, PROCESS, etc., that accept a template name
497       as the first argument, will automatically quote it for convenience.
498
499           [% INCLUDE foo/bar.txt %]
500
501       equivalent to:
502
503           [% INCLUDE "foo/bar.txt" %]
504
505       To INCLUDE a template whose name is stored in a variable, simply prefix
506       the variable name with '$' to have it interpolated.
507
508           [% myfile = 'header' %]
509           [% INCLUDE $myfile %]
510
511       equivalent to:
512
513           [% INCLUDE header %]
514
515       Note also that a variable containing a reference to a Template::Docu‐
516       ment object can also be processed in this way.
517
518           my $vars = {
519           header => Template::Document->new({ ... }),
520           };
521
522       template:
523
524           [% INCLUDE $header %]
525
526       Local and Global Variables
527
528       Any simple variables that you create, or any changes you make to exist‐
529       ing variables, will only persist while the template is being processed.
530       The top-level variable hash is copied before processing begins and any
531       changes to variables are made in this copy, leaving the original
532       intact.  The same thing happens when you INCLUDE another template.  The
533       current namespace hash is cloned to prevent any variable changes made
534       in the included template from interfering with existing variables.  The
535       PROCESS option bypasses the localisation step altogether making it
536       slightly faster, but requiring greater attention to the possibility of
537       side effects caused by creating or changing any variables within the
538       processed template.
539
540           [% BLOCK change_name %]
541              [% name = 'bar' %]
542           [% END %]
543
544           [% name = 'foo' %]
545           [% INCLUDE change_name %]
546           [% name %]              # foo
547           [% PROCESS change_name %]
548           [% name %]              # bar
549
550       Dotted compound variables behave slightly differently because the
551       localisation process is only skin deep.  The current variable namespace
552       hash is copied, but no attempt is made to perform a deep-copy of other
553       structures within it (hashes, arrays, objects, etc).  A variable refer‐
554       encing a hash, for example, will be copied to create a new reference
555       but which points to the same hash.  Thus, the general rule is that sim‐
556       ple variables (undotted variables) are localised, but existing complex
557       structures (dotted variables) are not.
558
559           [% BLOCK all_change %]
560              [% x = 20 %]         # changes copy
561              [% y.z = 'zulu' %]       # changes original
562           [% END %]
563
564           [% x = 10
565              y = { z => 'zebra' }
566           %]
567           [% INCLUDE all_change %]
568           [% x %]             # still '10'
569           [% y.z %]               # now 'zulu'
570
571       If you create a complex structure such as a hash or list reference
572       within a local template context then it will cease to exist when the
573       template is finished processing.
574
575           [% BLOCK new_stuff %]
576              [% # define a new 'y' hash array in local context
577                 y = { z => 'zulu' }
578              %]
579           [% END %]
580
581           [% x = 10 %]
582           [% INCLUDE new_stuff %]
583           [% x %]             # outputs '10'
584           [% y %]             # nothing, y is undefined
585
586       Similarly, if you update an element of a compound variable which
587       doesn't already exists then a hash will be created automatically and
588       deleted again at the end of the block.
589
590           [% BLOCK new_stuff %]
591              [% y.z = 'zulu' %]
592           [% END %]
593
594       However, if the hash does already exist then you will modify the origi‐
595       nal with permanent effect.  To avoid potential confusion, it is recom‐
596       mended that you don't update elements of complex variables from within
597       blocks or templates included by another.
598
599       If you want to create or update truly global variables then you can use
600       the 'global' namespace.  This is a hash array automatically created in
601       the top-level namespace which all templates, localised or otherwise see
602       the same reference to.  Changes made to variables within this hash are
603       visible across all templates.
604
605           [% global.version = 123 %]
606
607       Compile Time Constant Folding
608
609       In addition to variables that get resolved each time a template is pro‐
610       cessed, you can also define variables that get resolved just once when
611       the template is compiled.  This generally results in templates process‐
612       ing faster because there is less work to be done.
613
614       To define compile-time constants, specify a CONSTANTS hash as a con‐
615       structor item as per VARIABLES.  The CONSTANTS hash can contain any
616       kind of complex, nested, or dynamic data structures, just like regular
617       variables.
618
619           my $tt = Template->new({
620           CONSTANTS => {
621               version => 3.14,
622               release => 'skyrocket',
623               col     => {
624               back => '#ffffff',
625               fore => '#000000',
626               },
627               myobj => My::Object->new(),
628               mysub => sub { ... },
629               joint => ', ',
630           },
631           });
632
633       Within a template, you access these variables using the 'constants'
634       namespace prefix.
635
636           Version [% constants.version %] ([% constants.release %])
637
638           Background: [% constants.col.back %]
639
640       When the template is compiled, these variable references are replaced
641       with the corresponding value.  No further variable lookup is then
642       required when the template is processed.
643
644       You can call subroutines, object methods, and even virtual methods on
645       constant variables.
646
647           [% constants.mysub(10, 20) %]
648           [% constants.myobj(30, 40) %]
649           [% constants.col.keys.sort.join(', ') %]
650
651       One important proviso is that any arguments you pass to subroutines or
652       methods must also be literal values or compile time constants.
653
654       For example, these are both fine:
655
656           # literal argument
657           [% constants.col.keys.sort.join(', ') %]
658
659           # constant argument
660           [% constants.col.keys.sort.join(constants.joint) %]
661
662       But this next example will raise an error at parse time because 'joint'
663       is a runtime variable and cannot be determined at compile time.
664
665           # ERROR: runtime variable argument!
666           [% constants.col.keys.sort.join(joint) %]
667
668       The CONSTANTS_NAMESPACE option can be used to provide a different
669       namespace prefix for constant variables.  For example:
670
671           my $tt = Template->new({
672           CONSTANTS => {
673               version => 3.14,
674               # ...etc...
675           },
676           CONSTANTS_NAMESPACE => 'const',
677           });
678
679       Constants would then be referenced in templates as:
680
681           [% const.version %]
682
683       Special Variables
684
685       A number of special variables are automatically defined by the Template
686       Toolkit.
687
688       template
689           The 'template' variable contains a reference to the main template
690           being processed, in the form of a Template::Document object.  This
691           variable is correctly defined within PRE_PROCESS, PROCESS and
692           POST_PROCESS templates, allowing standard headers, footers, etc.,
693           to access metadata items from the main template.  The 'name' and
694           'modtime' metadata items are automatically provided, giving the
695           template name and modification time in seconds since the epoch.
696
697           Note that the 'template' variable always references the top-level
698           template, even when processing other template components via
699           INCLUDE, PROCESS, etc.
700
701       component
702           The 'component' variable is like 'template' but always contains a
703           reference to the current, innermost template component being pro‐
704           cessed.  In the main template, the 'template' and 'component' vari‐
705           able will reference the same Template::Document object.  In any
706           other template component called from the main template, the 'tem‐
707           plate' variable will remain unchanged, but 'component' will contain
708           a new reference to the current component.
709
710           This example should demonstrate the difference:
711
712               $template->process('foo')
713               ⎪⎪ die $template->error(), "\n";
714
715           'foo':
716
717               [% template.name %]         # foo
718               [% component.name %]        # foo
719               [% PROCESS footer %]
720
721           'footer':
722
723               [% template.name %]         # foo
724               [% component.name %]        # footer
725
726           Additionally, the 'component' variable has two special fields:
727           'caller' and 'callers'.  'caller' contains the name of the template
728           that called the current template (or undef if the values of 'tem‐
729           plate' and 'component' are the same).  'callers' contains a refer‐
730           ence to a list of all the templates that have been called on the
731           road to calling the current component template (like a call stack),
732           with the outer-most template first.
733
734           Here's an example:
735
736           'outer.tt2':
737
738               [% component.name %]        # 'outer.tt2'
739               [% component.caller %]      # undef
740               [% component.callers %]     # undef
741               [% PROCESS 'middle.tt2' %]
742
743           'middle.tt2':
744
745               [% component.name %]        # 'middle.tt2'
746               [% component.caller %]      # 'outer.tt2'
747               [% component.callers %]     # [ 'outer.tt2' ]
748               [% PROCESS 'inner.tt2' %]
749
750           'inner.tt2':
751
752               [% component.name %]        # 'inner.tt2'
753               [% component.caller %]      # 'middle.tt2'
754               [% component.callers %]     # [ 'outer.tt2', 'middle.tt2' ]
755
756       loop
757           Within a FOREACH loop, the 'loop' variable references the Tem‐
758           plate::Iterator object responsible for controlling the loop.
759
760               [% FOREACH item = [ 'foo', 'bar', 'baz' ] -%]
761                  [% "Items:\n" IF loop.first -%]
762                  [% loop.count %]/[% loop.size %]: [% item %]
763               [% END %]
764
765       error
766           Within a CATCH block, the 'error' variable contains a reference to
767           the Template::Exception object thrown from within the TRY block.
768           The 'type' and 'info' methods can be called or the variable itself
769           can be printed for automatic stringification into a message of the
770           form "$type error - $info".  See Template::Exception for further
771           details.
772
773               [% TRY %]
774                  ...
775               [% CATCH %]
776                  [% error %]
777               [% END %]
778
779       content
780           The WRAPPER method captures the output from a template block and
781           then includes a named template, passing the captured output as the
782           'content' variable.
783
784               [% WRAPPER box %]
785               Be not afeard; the isle is full of noises,
786               Sounds and sweet airs, that give delight and hurt not.
787               [% END %]
788
789               [% BLOCK box %]
790               <table border=1>
791               <tr>
792                 <td>
793                 [% content %]
794                 </td>
795               </tr>
796               </table>
797               [% END %]
798
799       Compound Variables
800
801       Compound 'dotted' variables may contain any number of separate ele‐
802       ments.  Each element may evaluate to any of the permitted variable
803       types and the processor will then correctly use this value to evaluate
804       the rest of the variable.  Arguments may be passed to any of the inter‐
805       mediate elements.
806
807           [% myorg.people.sort('surname').first.fullname %]
808
809       Intermediate variables may be used and will behave entirely as
810       expected.
811
812           [% sorted = myorg.people.sort('surname') %]
813           [% sorted.first.fullname %]
814
815       This simplified dotted notation has the benefit of hiding the implemen‐
816       tation details of your data.  For example, you could implement a data
817       structure as a hash array one day and then change it to an object the
818       next without requiring any change to the templates.
819

AUTHOR

821       Andy Wardley <abw@wardley.org>
822
823       <http://wardley.org/http://wardley.org/>
824

VERSION

826       Template Toolkit version 2.18, released on 09 February 2007.
827
829         Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.
830
831       This module is free software; you can redistribute it and/or modify it
832       under the same terms as Perl itself.
833
834
835
836perl v5.8.8                       2007-02-09    Template::Manual::Variables(3)
Impressum