所以看来如果我给模板工具包一个对数组的引用作为参数
ARRAY_REF => \@array
然后在模板中包含以下代码
[% IF ( ARRAY_REF ) %]
Do something
[% ELSE %]
Do something else
[% END %]
其他情况永远不会被触发。
用
替换参数代码ARRAY_REF => @array ? \@array : undef;
似乎解决了这个问题,但是我想知道是否有办法让模板工具包评估一个空数组(通过引用传递)为false,因为我的项目中有很多实例,我相信这个实例正在被使用(如在HTML模板中,它按预期工作。
提前感谢大家的帮助。
答案 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 ) %]