编辑:根据更新的问题和问题作者的评论重写了使用Template::Toolkit的答案。
# Your app sets up whatever data structure it wants to pass to the tempalte, for example,
my @rows = [
[ # cells in row #1
{ url => 'www.mywebsite.com/Home', label => 'Home' },
{ url => 'www.mywebsite2.com/Office', label => 'Office' },
],
[ # cells in row #2
{ url => 'www.mywebsite3.com/Play', label => 'Play' },
{ label => 'Travel' },
],
];
# No need to print, prints to STDOUT automatically by default
my $tmpl = Template->new;
$tmpl->process(\*DATA, { rows => \@rows })
|| die $tmpl->error();
__DATA__
<table border="1">
[% FOR row IN rows %]
<tr>
[% FOR cell IN row %]
<td>
[% IF cell.url %]
<a href="http://[% cell.url | url %]">[% cell.label | html %]</a>
[% ELSE %]
[% cell.label | html %]
[% END %]
</td>
[% END %]
</tr>
[% END %]
</table>
Template::Toolkit 具有许多与 Perl 相同的功能(如果启用 Perl 块,实际上完全相同,但我不建议这样做)。
在每个[% %]
您放入指令的内部。如果没有指令并且没有使用 执行赋值=
,则该块被视为变量查找,并且传递到模板的值被插入到那里的文本中。在进行变量查找时,您可以使用句点来遍历整个复杂的数据结构以分隔查找。例如,
[% rows.0.0.label %]
在上面的示例中插入,将输出“Home”。
上面显示的| url
and| html
符号添加了过滤器,这些过滤器将清理输出以确保[% %]
块内的值输出为正确的 URL 或 HTML(通常避免 XSS 和其他输出格式错误)。
Template Toolkit 有时对它的工作方式有点模糊和不精确,甚至不如 Perl 严格,所以有时你必须小心一点。这也可能是一个性能问题,特别是如果您process()
在应用程序中调用很多次(将模板嵌入另一个往往会更快一些)。但是,它在大多数模板问题上都做得相当好,如果您需要与网页设计师合作,界面也不会太吓人。
如果您使用 Template::Toolkit,我强烈建议您通读本教程以了解它。
原答案:
Lone Shepherd 的评论是答案:
我正在使用该模块HTML::Template
创建一个像这样的格式化表(使用 array @rows
):
my $tmpl = HTML::Template->new(filehandle => \*DATA);
$tmpl->param(ROWS => \@rows);
print $tmpl->output;
__DATA__
<table border="1">
<TMPL_LOOP ROWS>
<tr>
<TMPL_LOOP CELLS>
<td><a href="http://www.mywebsite.com/<TMPL_VAR CELL ESCAPE=HTML>"><TMPL_VAR CELL ESCAPE=HTML></a></td>
</TMPL_LOOP>
</tr>
</TMPL_LOOP>
</table>
只需为您的超链接添加 HTML。根据HTML::Template的文档,您可以将<TMPL_VAR ...>
位放在属性中。
作为旁注,添加ESCAPE=HTML
也是一个好主意,除非你确定你已经清理了你的输出(防止像跨站点脚本攻击你的 web 应用程序)。