在没有插件的情况下调用Template Toolkit中的subs和模块?

时间:2009-08-16 21:59:30

标签: perl template-toolkit

我试图在Template Toolkit .tt文件中调用外部Perl模块。我想要使​​用的模块是Util,我想调用Util::prettify_date。我能够使用Template Toolkit的插件界面包含此模块:我设置了load,new和error函数(如此处所述:http://template-toolkit.org/docs/modules/Template/Plugin.html),并使用[% USE Util %]包含它。

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

3 个答案:

答案 0 :(得分:15)

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

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

[% divider( 40 ) %]
Hello my name is [% capitalize( 'barry' ) %], how are u today?
The ultimate answer to life is [% sum( 10, 30, 2 ) %]
[% divider( 40 ) %]


会产生这个:

========================================
Hello my name is Barry, how are u today?
The ultimate answer to life is 42
========================================

答案 1 :(得分:6)

您是否在[% PERL %]区块中尝试过use模块?

现在,我个人会编写一个插件,在删除第一个参数后,将MyOrg::Plugin::Util->prettify_date传递给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;
}

答案 2 :(得分: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程序包命名空间中的evaluated中,您将用package main覆盖它。

危险来自于您的模板除了可以从主命名空间中读取之外,还可以写入到主命名空间中。