7

我试图在 Template Toolkit .tt 文件中调用外部 Perl 模块。我要使用的模块是Util,我想调用Util::prettify_date. 我能够使用 Template Toolkit 的插件接口包含此模块:我设置了加载、新建和错误功能(如此处所述:http: //template-toolkit.org/docs/modules/Template/Plugin.html),并使用[% USE Util %].

这很好用,但我想知道是否有一种方法可以USE在 Template Toolkit 中使用 Perl 模块而无需插件化它们。制作插件的主要问题是我必须以Util面向对象的方式制作所有函数(即接受 $self 作为第一个参数),这实际上没有意义。

4

3 回答 3

17

您还可以将函数(即子例程)传递给模板,如下所示:

use strict;
use warnings;
use List::Util ();
use Template;

my $tt = Template->new({
    INCLUDE_PATH  => '.',
});

$tt->process( 'not_plugin.tt', { 
    divider    => sub { '='  x  $_[0]         },
    capitalize => sub { ucfirst $_[0]         },
    sum        => sub { List::Util::sum( @_ ) },
});


not_plugin.tt

[% 分频器 (40) %]
你好,我的名字是 [% capitalize( 'barry' ) %],你今天好吗?
生活的最终答案是 [% sum( 10, 30, 2 ) %]
[% 分频器 (40) %]


会产生这个:

=========================================
你好,我的名字是巴里,你今天好吗?
人生的终极答案是42
=========================================
于 2009-08-17T08:20:46.583 回答
6

您是否尝试过use将模块放在一个[% PERL %]块中?

现在,我个人会编写一个插件,在去掉第一个参数之后,它会传递一个MyOrg::Plugin::Util->prettify_dateto 。Util::prettify_date您也可以自动创建这些方法:

my @to_proxy = qw( prettify_date );

sub new {
    my $class = shift;

    {
        no strict 'refs';
        for my $sub ( @to_proxy) {
            *{"${class}::${sub}"} = sub {
                my $self = shift;
                return "My::Util::$sub"->( @_ );
            }
        }
    }
    bless {} => $class;
}
于 2009-08-16T23:24:42.923 回答
0

完成此操作的最简单、最危险的方法是使用[% PERL %]块并强制在main命名空间中进行评估。

[% PERL %]
package main;
# You can now use any variables and subroutines as though this were in the main namespace
[% END %]

这是必要的,因为该[% PERL %]块是在一个隔离的包命名空间中评估Template::Perl的,您将使用它覆盖package main

危险来自您的模板除了读取主命名空间之外还能够写入主命名空间,这可能会导致一些有趣的调试。

于 2020-06-15T17:05:59.150 回答