7

TemplateToolkit.ttファイルで外部のPerlモジュールを呼び出そうとしています。使用したいモジュールはUtil、で、呼び出したいですUtil::prettify_date。Template Toolkitのプラグインインターフェースを使用してこのモジュールを含めることができました:load、new、およびerror関数を設定しました(ここで説明されているように:http://template-toolkit.org/docs/modules/Template/Plugin.html)、を使用して含めます[% USE Util %]

USEこれは問題なく動作しますが、プラグイン化せずにTemplateToolkitで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

[%divider(40)%]
こんにちは私の名前は[%capitalize('barry')%]です、今日はどうですか?
人生への究極の答えは[%sum(10、30、2)%]です
[%divider(40)%]


これを生成します:

========================================
こんにちは私の名前はバリーです、今日は元気ですか?
人生への究極の答えは42です
========================================
于 2009-08-17T08:20:46.583 に答える
6

useモジュールを[% PERL %]ブロックで試してみましたか?

さて、私は個人的に、最初の引数を取り除いた後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;
}
于 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 に答える