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