如何使用HTML模板显示嵌套循环

时间:2013-09-30 18:50:44

标签: html perl templates

我正在尝试使用tmpl_loop设置嵌套循环,但我对HTML :: Template模块的经验很少。

我想要做的布局是这样的:

Name       Start         End 
Dog      04-02-1996    06-19-2011 

Breed:  Terrier       Sex: Male 
Color:  Brown         Eye Color: Green 
Weight: 10 Pounds     Attribute: bla bla

Name       Start         End 
Dog      03-04-1985    06-01-1988

Breed:  Retriever     Sex: Female 
Color:  Black         Eye Color: Green 
Weight: 50 Pounds     Attribute: bla bla

等等......

狗的数量可能会有所不同,它可能有也可能没有附加信息,但如果有,则必须显示所有字段。

这是我正确显示水平信息的块。

<table width="100%">
<tr>
    <tmpl_loop name=labels>
    <td class="label"> <TMPL_VAR label>: </td> 
    </tmpl_loop>
</tr>
<tmpl_loop name=values>
    <tr>
        <tmpl_loop name=values>
        <td><TMPL_VAR value ></td>
        </tmpl_loop>
    </tr>
</tmpl_loop>
</table>

但是如何修改HTML模板以在示例显示中显示信息?

此外,相应的Perl数据结构如何?

谢谢。

1 个答案:

答案 0 :(得分:3)

在您的情况下,您不需要嵌套循环。

将模板文件更改为:

<table>
    <TMPL_LOOP dogs>
        <tr><td>&nbsp;</td><td></td><td></td><td></td><td></td><td></td></tr>
        <tr>
            <td></td><td>Name</td>
            <td></td><td>Start</td>
            <td></td><td>End</td>
        </tr>
        <tr>
            <td><TMPL_VAR ldogname></td><td><TMPL_VAR dogname></td>
            <td><TMPL_VAR lstart></td><td><TMPL_VAR start></td>
            <td><TMPL_VAR lend></td><td><TMPL_VAR end></td>
        </tr>
        <tr>
            <td><TMPL_VAR lbreed></td><td><TMPL_VAR breed></td>
            <td><TMPL_VAR lsex></td><td><TMPL_VAR sex></td>
            <td><TMPL_VAR lcolor></td><td><TMPL_VAR color></td>
        </tr>
        <tr>
            <td><TMPL_VAR leye></td><td><TMPL_VAR eye></td>
            <td><TMPL_VAR lweight></td><td><TMPL_VAR weight></td>
            <td><TMPL_VAR lattr></td><td><TMPL_VAR attr></td>
        </tr>
    </TMPL_LOOP>
</table>

和你的代码:

#!/usr/bin/perl
use warnings;
use strict;
use HTML::Template;

my $template=HTML::Template->new(filename=>'template.txt');
my @dogs=( #dogs data
    {dogname=>'Dog',start=>'04-02-1996',end=>'06-19-2011',breed=>'Terrier',sex=>'Male',color=>'Brown',eye=>'Green',weight=>'10 Pounds',attr=>'bla bla'},
    {dogname=>'Dog',start=>'03-04-1985',end=>'06-01-1988',breed=>'Retriever',sex=>'Female',color=>'Black',eye=>'Green',weight=>'50 Pounds',attr=>'bla bla'},
);
my %labels=(
    ldogname=>'',
    lstart=>'',
    lend=>'',
    lbreed=>'Breed: ',
    lsex=>'Sex: ',
    lcolor=>'Color: ',
    leye=>'Eye Color: ',
    lweight=>'Weight: ',
    lattr=>'Attribute: '
);
for my $dog (@dogs) { #mix labels and values
    while (my ($k,$v)=each %labels) {
        $dog->{$k}=$v;
    }
}
$template->param(dogs=>\@dogs);
print $template->output;

您将获得所需的输出。

但是要回答你的问题,你可以查看一些嵌套循环的例子:http://www.perlmonks.org/?node_id=770278 http://www.perlmonks.org/?node_id=193367(谷歌会返回更多结果)