9

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

ARRAY_REF => \@array

然后在模板中有以下代码

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

else 案例永远不会被触发。

将参数代码替换为

ARRAY_REF => @array ? \@array : undef;

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

预先感谢大家的帮助。

4

3 回答 3

23

ARRAY_REF会是真的,因为它是被定义的,并且在 Perl 中它是一个真正的价值。通常的方法是检查它是否为真且非空:

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

说出你真正的意思,让计算机假装比它更聪明会导致奇怪的惊喜。

您可能会改变 TT 的真实性概念,但我认为您不会喜欢它或您可能会遇到的各种不愉快的副作用。Template Toolkit 不是 HTML Template Pro,在罗马时就像罗马人那样做。

最好的办法是修复模板并将额外工作视为移植过程的一部分。不过,您可能可以构建一个插件来为您做“真实且非空”的事情。

于 2011-02-03T05:49:28.630 回答
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 中是正确的——</p>

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

当你直接这样做时,它会更明显(也许)为什么它应该是显而易见的——</p>

perl -le 'print "true" if []'
true
于 2011-02-03T05:50:21.763 回答
-3

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

[% IF ( ARRAY_REF.0 ) %]
于 2011-02-03T03:50:27.423 回答