添加自定义功能到Tpage (Template::Toolkit)

Naz*_*zar 3 perl template-toolkit

我正在使用 Tpage(模板工具包的命令行包装器),文档描述了如何为标量、列表或散列变量创建自定义虚拟方法,然后将其称为variable.custom_method(). 但是,我想在模板中定义一些可以直接使用的独立函数。想法如下:

这是我的functions.tt 文件:

[%- PERL -%]

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

[%- END -%]

[% myInteger=18 %]
Run Code Online (Sandbox Code Playgroud)

这是我的 template.tt 文件:

Some text
The value of [%myInteger%] in hexadecimal is [% int2hex(myInteger) %]
More text
Run Code Online (Sandbox Code Playgroud)

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

tpage --eval_perl --pre_process=functions.tt template.tt > result.f
Run Code Online (Sandbox Code Playgroud)

预期function.tt文件将首先被处理,并且int2hex()子例程可用于该template.tt文件。但是,我收到一条错误消息,指出undef error - int2hex is undefined. 另一方面,它并不抱怨myInteger.

看起来[% PERL %][% END %]该文件的部分没有将该int2hex函数添加到方法列表中。使用此处描述的宏或插件来实现这一点并不简单

有没有更简单的方法直接在模板文件中定义函数?

Mar*_*ijn 5

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

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

代码,改编自https://www.perlmonks.org/?node_id=117720

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

[% myInteger=18 %]
Run Code Online (Sandbox Code Playgroud)

结果:

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

[% myInteger=18 %]
Run Code Online (Sandbox Code Playgroud)