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

cjh*_*cjh 8 perl template-toolkit

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

ARRAY_REF => \@array
Run Code Online (Sandbox Code Playgroud)

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

[% IF ( ARRAY_REF ) %]
  Do something
[% ELSE %]
  Do something else
[% END %]
Run Code Online (Sandbox Code Playgroud)

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

用.替换参数代码

ARRAY_REF => @array ? \@array : undef;
Run Code Online (Sandbox Code Playgroud)

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

提前谢谢大家的帮助.

mu *_*ort 23

你的ARRAY_REF意志是真实的,因为它是定义的,它在Perl中是真正的价值.通常的方法是检查它是否为真且非空:

[% IF ARRAY_REF && ARRAY_REF.size %]
    Do something
[% ELSE %]
    Do something else
[% END %]
Run Code Online (Sandbox Code Playgroud)

说出你真正的意思,要求计算机假装更聪明,而不是导致奇怪的惊喜.

你可能会改变TT的真实性概念,但我不认为你会喜欢它或者你可能遇到的各种令人不快的副作用.模板工具包不是HTML模板专业版,在罗马时就像罗马人那样做.

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


Ash*_*ley 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
Run Code Online (Sandbox Code Playgroud)

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

perl -le '$abc = []; print "true" if $abc'
true
Run Code Online (Sandbox Code Playgroud)

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

perl -le 'print "true" if []'
true
Run Code Online (Sandbox Code Playgroud)

  • 也正确,但遗憾的是我不能接受两个答案.非常感谢你:) (2认同)