技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Linux --> [Perl] Template::Toolkit 模板技术.

[Perl] Template::Toolkit 模板技术.

浏览:5372次  出处信息

Template::Toolkit, 简称TT, 它本身是一套非常强大的模块,我发现它比 HTML::Template 更加强大的模板.可以用超强来讲.可以给复杂变量传到模板里(比如数组,哈希),也可以在模板里定义这些变量,模板中可以用逻辑,包括IF ELSE 结构和各种循环结构, 有很多与定义的 Vmethod (虚方法)可以调用,这个很好用的,支持扩展其功能的 Plugin.还有什么 过滤器 filter 之类.

想了解 HTML::Template 可以看我以前的文章, perl的HTML::Template模板技术.

Template::Toolkit简单的例子
 

 

use Template;
# 建一个 TT 的对象
my $config = {
    INCLUDE_PATH => '/template/path',
    EVAL_PERL    => 1,
};
 
my $template = Template->new($config);
 
my $vars = {
    var => "放入模板的内容",
};
 
# 使用
my $templateFile = 'template.tt';
my $outputContent;
$template->process($template, $vars, $outputContent) || die $template->error();
 
print $output;

template.tt 的文件内容

<title></title>
 
这里出现的是: [% var %]

通过上面可以看到,是使用置换变量来定义$vars中.
Template::Toolkit Config 的常用参数
INCLUDE_PATH 也就是你的template文件所放置的位置,可以指定不只一个路径。
EVAL_PERL   这个选项是设定是否让你的Template执行Perl的区块。
POST_CHOMP  这个选项跟chomp函数有一些类似,它可以帮你去除使用者参数的空白字符。
PRE_PROCESS  设定所有的模板在被载入之后,都必须预先执行某个程序,例如先把档头输出到模板中等等。

Template Toolkit 和 HTML::Template 最大的分别之一就是可以有自己对变量进行处理
 

 

Template Toolkit 中使用数组

例如我们使用 Template 提供的 FOREACH 循环,来取一个数组的数据
程序写法

@array = (1, 2, 3, 4, 5, );

模板写法

[% FOREACH array = arrays %]
数据:[% array %]
[% END %]

 

Template Toolkit 中使用Hash,我们可以直接使用键值

程序写法

%hash = (
        name => 'php-oa',
        age    => '23',
        );
my $vars = { var => \%hash };

模板写法

[% var.name%]
[% var.age %]

[% INCLUDE %] 插入其它模板到当前模板中

[% INCLUDE copyright.tt2 %]

这个方便吧,多个模板,时相当的方便.只要修改一下 copyright.tt2 的文件,整个模板系统都会改变.
 

Template::Toolkit 模板其它内部的标签

和 HTML::Template 这个就很接近了
while

[% WHILE condition %]
   ....
[% END %]

if

[% IF condition %]
   ....
[% ELSE %]
   ....
[% END %]

ELSIF

[% IF condition %]
   ....
[% ELSIF condition2 %]
   ....
[% ELSE %]
   ....
[% END %]

直接写 Perl 程序
还有个奇怪的地方.想在模板里面写Perl程序,也只需要这么作:

[% PERL %]
   # perl 程序码
   ....
[% END %]

 

Template::Toolkit 模板其它一些常用的技巧
 

使用 - 去掉换行

Hello [% a = 3 %]
World [% a %]

这个输出的话为“Hello \nWorld 3\n”。而这么写可以把里面的 \n 去掉:

Hello [% a = 3 -%]
World [% a -%]

输出为“Hello World 3”

合并两个 TT 代码

[% user.name %][% END %]

可以写成

[% user.name; END %]

INSERT 和 INCLUDE 的区别
INSERT 只是插入文件的内容而不管你是不是另一个 .tt 文件。而 INCLUDE 的话如果是另一个 .tt 文件的话会执行它。
比如你有一个文件叫 footer.tt, 内容为:

以下是引用片段:
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href="http://catalyst.perl.org">Catalyst</a> [% CatalystVersion %].

当在另一个文件中调用 [% INSERT footer.tt %] 时输出的结果跟上面的会一样。里面的 [% CatalystVersion %] 是原封不动。而如果是用 [% INCLUDE footer.tt %] 的话里面的 [% CatalystVersion %] 会被执行为这个变量的值。


BLOCK

比如你有段代码要执行两次。比如我有一个导航栏,需要上面放一个下面放一个。那我可以这么写:

[% show_guidebar = BLOCK %]
<p>[% IF prev_topic %]<</p>
[% END %]
 
[% show_guidebar %]
 
...
 
[% show_guidebar %]

注释
注释很简单,在 [% 后加上 # 那这一行就被注释掉了。唯一值得注意的是下面这两种是不一样的:

[%# a = 77
   b = 88
%]
a: [% a %] b: [% b %]

输出 a: b:
而[% 和 # 中间空了一格后就只有注释一行而不是整个 [% %], 如:

[% # a = 77
   b = 88
%]
a: [% a %] b: [% b %]

输出 a: b: 88

修改 TT 的 [%%] 标签
如果要修改上面的[%%]标签,认为不好看的话,可以如下操作

my $template = Template->new({
                   START_TAG => quotemeta(' quotemeta('?>'),
             });

那么刚刚在模板里的变量就应该改写成<? var ?>.

TT 进行时间显示
    比如需要显示一个 2009-02-26这样一个格式的时间,而不希望改变Controller
    Template::Plugin::Date 这个perl模块可以解决问题

例子:

[% USE date %]
[% date.format(date.now, '%y-%m-%d') %]

这样就得到了2009-02-26

如果觉得不够用呢.还可以调用Date::Calc

    [% calc = date.calc %]
    [% calc.Monday_of_Week(22, 2001).join('/') %]

建议继续学习:

  1. perl更新/修改/删除文本文件内容    (阅读:9443)
  2. perl大牛flw传说    (阅读:6516)
  3. perl模块Getopt::Std用法及实例-从命令行读取参数模块    (阅读:5892)
  4. 在perl中连接和使用sqlite做数据存储    (阅读:5067)
  5. Perl命令行常见用法及技巧    (阅读:4814)
  6. perl的expect使用方法,实现非交互式登录。    (阅读:4500)
  7. Perl 倒行分析文件方法。perl读文本文件,从末尾往前读.    (阅读:4445)
  8. perl模块之MIME::Lite发送有附件的邮件    (阅读:4448)
  9. perl大牛唐凤传说    (阅读:4277)
  10. 前端模板引擎    (阅读:3783)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:sudo规则支持正则
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1