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函数添加到方法列表中。使用此处描述的宏或插件来实现这一点并不简单
有没有更简单的方法直接在模板文件中定义函数?
您可以通过将子例程添加到$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)