3

Template-Toolkitは常に undef を空の文字列に補間したいようです。したがって、次のようなテンプレートです。

Result is [% some_object.some_method (1, undef, 2) %]

またはこれ:

Result is [% ttvar %]
          [% some_object.some_method (1, ttvar, 2) %]

次のような Perl への呼び出しを生成します。

some_object->some_method (1, '', 2)

私が欲しいのは:

some_object->some_method (1, undef, 2)

空の文字列の代わりに undef を渡す方法はありますか?

4

3 に答える 3

3

これは の設計上の決定Template Toolkitです。Perl Template Toolkit "Badger book"の 50 ページから:

テンプレート ツールキットは、値が定義されていない変数に遭遇しても文句を言いません。代わりに、変数の値に空の文字列 (つまり、何もない) を静かに使用し、テンプレートの通知を処理し続けます。

ただし、できることは、DEBUG オプションを使用して、未定義を検出したときに TT に警告を表示させることです。SO の質問Can Perl's Template Toolkit warn on undefined values?を参照してください。詳細については。

/I3az/

于 2009-11-03T14:43:10.610 に答える
3

EVAL_PERL が TT でどのように機能するかの例を示す別の回答を追加しました。

use Template;
use DateTime;

my $tt = Template->new( EVAL_PERL => 1 );

my $vars = { foo => 'DateTime', bar => DateTime->now, p => 'print' };

my $file = q{
    [% SET hello = 'Hello world' %]
    [% PERL %]
    print "[% hello %]\n";
    print [% foo %]->now, "\n";
    [% p %] $stash->get( 'bar' )->ymd;
    [% END %]
};

$tt->process( \$file, $vars );

上記の出力は次のとおりです。

Hello world
2009-11-03T15:31:50
2009-11-03

TT はプリプロセッサとして機能し、解釈する次の Perl コードを生成するためです。

print "hello world\n";
print DateTime->now, "\n";
print $stash->get( 'bar' )->ymd;

注意。上記の行の $stash は TT によって提供され、最上位の stash オブジェクトへの参照です。

/I3az/

于 2009-11-03T15:36:11.390 に答える
3

を使用しては[% PERL %]どうですか?

[% PERL %]
[% my_perl_code %]
[% END %]
于 2009-11-03T14:30:55.320 に答える