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

怎么用[% PERL %]

[% PERL %]
[% my_perl_code %]
[% END %]
于 2009-11-03T14:30:55.320 回答
3

这是一个设计决策Template Toolkit。从Perl 模板工具包“Badger book”的第 50 页:

如果模板工具包遇到没有定义值的变量,它不会抱怨。相反,它会悄悄地使用一个空字符串(即,什么都没有)作为变量的值,并继续处理模板的提示。

但是,您可以做的是使用 DEBUG 选项让 TT 在看到 undef 时提供警告。请参阅 SO 问题Perl's Template Toolkit 是否会对未定义的值发出警告?了解更多信息。

/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 回答