向 Tpage(Template::Toolkit)添加自定义函数。

3

我正在使用 Tpage(Template Toolkit 的命令行封装程序),documentation 描述了如何为标量、列表或哈希变量创建自定义虚拟方法,然后将它们作为 variable.custom_method() 调用。然而,我想在模板中定义一些独立的函数,可以直接使用。想法如下:

这是我的 functions.tt 文件:

[%- PERL -%]

sub int2hex{
 my $intvar = shift;
 return sprintf("%X", $intvar);
};

[%- END -%]

[% myInteger=18 %]

这是我的 template.tt 文件:
Some text
The value of [%myInteger%] in hexadecimal is [% int2hex(myInteger) %]
More text

然后我会从命令行调用模板工具包,如下所示:

tpage --eval_perl --pre_process=functions.tt template.tt > result.f

期望的是首先处理function.tt文件,使得int2hex()子程序可以在template.tt文件中使用。然而,我收到了一个错误,说undef error - int2hex is undefined。另一方面,它并没有抱怨myInteger
看起来文件的[% PERL %][% END %]部分没有将int2hex函数添加到方法列表中。按照这里所述的方式,使用宏或插件实现这一点并不直观。
有没有更简单的方法直接在模板文件中定义函数?
1个回答

5

您可以通过将子例程添加到管理模板变量的$stash对象中,使其从模板中可用。 来自http://www.template-toolkit.org/docs/modules/Template/Stash.html

变量可以引用哈希数组、列表、子例程和对象以及简单值。 在处理变量、调用代码或对象方法、索引列表、哈希等时,stash会自动执行正确的操作。

来自https://www.perlmonks.org/?node_id=117720的代码:

[%- PERL -%]
$stash->set('int2hex', sub {
 my $intvar = shift;
 return sprintf("%X", $intvar);
});
[%- END -%]

[% myInteger=18 %]

结果:

Some text
The value of 18 in hexadecimal is 12
More text

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接