使用Perl在HTML表中创建超链接

时间:2012-07-28 17:23:11

标签: html perl

我正在使用模块HTML::Template来创建这样的格式化表格(使用数组@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><TMPL_VAR CELL></td> 
  </TMPL_LOOP>
  </tr> 
</TMPL_LOOP>
</table>

但是我现在想要创建表的某些元素的超链接。地址元素 链接取决于该单元格的文本以及表格的列。 示例: 如果某行包含元素Home, Office, Travel, Play 我希望它们与www.mywebsite.com/Homewww.mywebsite2.com/Officewww.mywebsite3.com/Play相关联,并且没有Travel的超链接。 如何在HTML :: Template创建表中创建此类超链接?

1 个答案:

答案 0 :(得分:4)

修改:根据问题作者的更新问题和评论重写使用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| html符号添加了清理输出的过滤器,以确保[% %]块中的值作为正确的URL或HTML输出(通常避免使用XSS和其他输出格式错误)。

模板工具包对于它如何在某些时候做事情有点模糊和不精确,甚至不如Perl严格,所以你有时需要小心一点。它也可能是一个性能问题,特别是如果你在你的应用程序中多次调用process()(在另一个中嵌入模板往往会快得多)。但是,它在大多数模板问题上都做得相当不错,如果您需要与网页设计师合作,界面也不会太可怕。

如果您使用Template :: Toolkit,我强烈建议您阅读the tutorial以了解它。

原始答案:

Lone Shepherd的评论就是答案:

我正在使用模块HTML::Template来创建这样的格式化表格(使用数组@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即可。根据{{​​3}}的文档,您可以将<TMPL_VAR ...>位放在属性中。

作为旁注,添加ESCAPE=HTML也是一个好主意,除非您确定已经清理了输出(阻止了Web应用程序中HTML::Template之类的内容)。