如何将undef作为参数从TT模板传递给对象方法?

时间:2009-11-03 14:13:07

标签: perl template-toolkit

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而不是空字符串?

3 个答案:

答案 0 :(得分:3)

如何使用[% PERL %]

[% PERL %]
[% my_perl_code %]
[% END %]

答案 1 :(得分: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;

NB。上面一行中的$ stash由TT提供,并且是对顶级存储对象的引用。

/ I3az /

答案 2 :(得分:2)

这是Template Toolkit的设计决定。来自Perl Template Toolkit "Badger book"的第50页:

  

如果模板工具包遇到没有定义值的变量,它就不会抱怨。相反,它会悄悄地使用一个空字符串(即根本没有任何东西)作为变量的值,并继续处理模板的提醒。

但是,你可以做的是让TT在看到使用DEBUG选项的undef时发出警告。有关详细信息,请参阅SO问题Can Perl’s Template Toolkit warn on undefined values?

/ I3az /