模板工具包IF在空数组上返回true,我可以将其设为false吗?

时间:2011-02-03 03:24:03

标签: perl template-toolkit

所以看来如果我给模板工具包一个对数组的引用作为参数

ARRAY_REF => \@array

然后在模板中包含以下代码

[% IF ( ARRAY_REF ) %]
  Do something
[% ELSE %]
  Do something else
[% END %]

其他情况永远不会被触发。

替换参数代码
ARRAY_REF => @array ? \@array : undef;

似乎解决了这个问题,但是我想知道是否有办法让模板工具包评估一个空数组(通过引用传递)为false,因为我的项目中有很多实例,我相信这个实例正在被使用(如在HTML模板中,它按预期工作。

提前感谢大家的帮助。

3 个答案:

答案 0 :(得分:23)

你的ARRAY_REF将是真的,因为它已被定义,并且它将是Perl中的真值。通常的方法是检查它是否为真且非空:

[% IF ARRAY_REF && ARRAY_REF.size %]
    Do something
[% ELSE %]
    Do something else
[% END %]

说出你真正的意思,要求电脑假装更聪明,而不是引起奇怪的惊喜。

你可能change TT's notion of truthiness但我不认为你会喜欢它或者你可能遇到的各种令人不快的副作用。模板工具包不是HTML模板专业版,在罗马时就像罗马人那样做。所有这一切。

您最好的办法是修复模板并将额外的工作视为移植过程的一部分。你可以建立一个插件来为你做“真实和非空”的东西。

答案 1 :(得分:11)

我认为.size就是你想要的。

perl -MTemplate -le '$t = Template->new; $t->process(\"[% \"O HAI\" IF arrayref.size %]", { arrayref => [] })'

perl -MTemplate -le '$t = Template->new; $t->process(\"[% \"O HAI\" IF arrayref.size %]", { arrayref => [1] })'
O HAI

我还提供了一个空数组ref在普通Perl中为真 -

perl -le '$abc = []; print "true" if $abc'
true

当你直接这样做时,更明显(也许)为什么它应该是显而易见的 -

perl -le 'print "true" if []'
true

答案 2 :(得分:-3)

通过访问第一个数组元素进行测试:

[% IF ( ARRAY_REF.0 ) %]