Mar
13
[原]Perl的HTML::KTemplate模块
二、其他参数
详细的参数说明,还是看官方的文档最好☞这里。
下面,我只列出一些需关注的内容:
1、$tpl->assign后面跟的是hash、hash的引用、函数的引用,当然也可以是嵌套的hash,而不是普通的标量或数组
%hash = (
VARIABLE => 'Value',
);
$tpl->assign( %hash );
$tpl->assign(\%hash );
$tpl->assign( VARIABLE => 'Value' );
VARIABLE => 'Value',
);
$tpl->assign( %hash );
$tpl->assign(\%hash );
$tpl->assign( VARIABLE => 'Value' );
嵌套的hash:
$tpl->assign(
USER => {
NAME => 'Kasper Dziurdz', # [% USER.NAME %]
EMAIL => 'kasper@repsak.de', # [% USER.EMAIL %]
},
);
USER => {
NAME => 'Kasper Dziurdz', # [% USER.NAME %]
EMAIL => 'kasper@repsak.de', # [% USER.EMAIL %]
},
);
用[% USER.NAME %] 和 [% USER.EMAIL %]来在HTML模板中对应。
函数的引用:
$tpl->assign(
BENCHMARK => sub {
# get benchmark data
return 'created in 0.01 seconds';
}
);
BENCHMARK => sub {
# get benchmark data
return 'created in 0.01 seconds';
}
);
这样,通过[% BENCHMARK %]就可执行该函数,并替换到HTML模板中。
2、使用<!-- BEGIN BLOCKNAME --> 和 <!-- END BLOCKNAME -->表示块
创建一个块:
#!/usr/bin/perl -w
use HTML::KTemplate;
$tpl = HTML::KTemplate->new('templates');
$tpl->assign( HEADER => 'Some numbers:' );
@block_values = ('One', 'Two', 'Three', 'Four');
foreach (@block_values) {
$tpl->block('LOOP_NUMBERS');
$tpl->assign( NUMBER => $_ );
$tpl->assign( SOMETHING => '' );
}
$tpl->block(); # 块结束
$tpl->assign( FOOTER => '...in words.' );
$tpl->process('template02.tpl');
$tpl->print();
use HTML::KTemplate;
$tpl = HTML::KTemplate->new('templates');
$tpl->assign( HEADER => 'Some numbers:' );
@block_values = ('One', 'Two', 'Three', 'Four');
foreach (@block_values) {
$tpl->block('LOOP_NUMBERS');
$tpl->assign( NUMBER => $_ );
$tpl->assign( SOMETHING => '' );
}
$tpl->block(); # 块结束
$tpl->assign( FOOTER => '...in words.' );
$tpl->process('template02.tpl');
$tpl->print();
※ 注意,循环的标记LOOP_NUMBERS。
对应的HTML模板是:
[% HEADER %]
<!-- BEGIN LOOP_NUMBERS -->
[% NUMBER %]
<!-- END LOOP_NUMBERS -->
[% FOOTER %]
<!-- BEGIN LOOP_NUMBERS -->
[% NUMBER %]
<!-- END LOOP_NUMBERS -->
[% FOOTER %]
执行结果:
引用
# perl ktemplate02.pl
Some numbers:
One
Two
Three
Four
...in words.
Some numbers:
One
Two
Three
Four
...in words.
因assign方法中调用的是引用,所以,也可以使用匿名数组来实现:
$tpl->assign(
HEADER => 'Some numbers:',
LOOP_NUMBERS =>
[
{ NUMBER => 'One' },
{ NUMBER => 'Two' },
{ NUMBER => 'Three' },
{ NUMBER => 'Four' },
],
FOOTER => '...in words.',
);
HEADER => 'Some numbers:',
LOOP_NUMBERS =>
[
{ NUMBER => 'One' },
{ NUMBER => 'Two' },
{ NUMBER => 'Three' },
{ NUMBER => 'Four' },
],
FOOTER => '...in words.',
);
※ 注意其中的[]和{}写法,分别是匿名数组和hash。
3、BLOCK的嵌套
perl脚本:
foreach (@block_one) {
$tpl->block('BLOCK_1');
$tpl->assign(VAR => $_);
foreach (@block_two) {
$tpl->block('BLOCK_1', 'BLOCK_2');
$tpl->assign(VAR => $_);
}
}
$tpl->block(); # 离开BLOCK,注意其位置
$tpl->block('BLOCK_1');
$tpl->assign(VAR => $_);
foreach (@block_two) {
$tpl->block('BLOCK_1', 'BLOCK_2');
$tpl->assign(VAR => $_);
}
}
$tpl->block(); # 离开BLOCK,注意其位置
对应的HTML模板:
引用
<!-- BEGIN BLOCK_1 -->
<!-- BEGIN BLOCK_2 -->
<!-- END BLOCK_2 -->
<!-- END BLOCK_1 -->
<!-- BEGIN BLOCK_2 -->
<!-- END BLOCK_2 -->
<!-- END BLOCK_1 -->
※ 嵌套BLOCK还可以使用IF ELSE写法,详细见这里
4、导入其他HTML模板
可以通过下面的写法,在一个文件中导入多个HTML模板:
<!-- INCLUDE file.tpl -->
<!-- INCLUDE "file.tpl" -->
<!-- INCLUDE 'file.tpl' -->
<!-- INCLUDE "file.tpl" -->
<!-- INCLUDE 'file.tpl' -->
当然,字符串部分也可以在perl中用变量来定义:
<!-- INCLUDE VARIABLE -->
5、一些方法
◎ process()方法
$tpl->process('header.tpl', 'footer.tpl');
$tpl->process('header.tpl');
$tpl->process('footer.tpl');
$tpl->process(\$scalar);
$tpl->process(\@array);
$tpl->process(\*FH);
$tpl->process('header.tpl');
$tpl->process('footer.tpl');
$tpl->process(\$scalar);
$tpl->process(\@array);
$tpl->process(\*FH);
◎ print()方法
$tpl->print();
$tpl->print(\*FILE);
$tpl->print(\*FILE);
\*FILE是一个文件句柄的引用,也就是输出到文件中。
◎ fetch()方法
生成一个标量,然后输出:
$output_ref = $tpl->fetch();
print FILE $$output_ref;
print FILE $$output_ref;
6、改变Tag标记
$HTML::KTemplate::VAR_START_TAG = '[%';
$HTML::KTemplate::VAR_END_TAG = '%]';
$HTML::KTemplate::BLOCK_START_TAG = '<!--';
$HTML::KTemplate::BLOCK_END_TAG = '-->';
$HTML::KTemplate::INCLUDE_START_TAG = '<!--';
$HTML::KTemplate::INCLUDE_END_TAG = '-->';
$HTML::KTemplate::VAR_END_TAG = '%]';
$HTML::KTemplate::BLOCK_START_TAG = '<!--';
$HTML::KTemplate::BLOCK_END_TAG = '-->';
$HTML::KTemplate::INCLUDE_START_TAG = '<!--';
$HTML::KTemplate::INCLUDE_END_TAG = '-->';
