Шаблонный набор инструментов IF для пустого массива ref возвращает true, могу ли я сделать его ложным? - PullRequest
8 голосов
/ 03 февраля 2011

Так что, похоже, если я дам шаблону инструментов ссылку на массив в качестве параметра

ARRAY_REF => \@array

и затем используйте следующий код в шаблоне

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

Другое дело никогда не срабатывает.

Замена кода параметра на

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

, кажется, решает проблему, однако мне было интересно, если есть способ заставить набор инструментов шаблона оценивать пустой массив (переданный по ссылке) как ложный, поскольку есть много случаев в моем проекте, где я полагаю, что это используется (как в шаблоне HTML Pro это работало, как и ожидалось).

Спасибо всем заранее за помощь.

Ответы [ 3 ]

23 голосов
/ 03 февраля 2011

Ваше ARRAY_REF будет истинным, поскольку оно определено и будет истинным значением в Perl.Обычный подход состоит в том, чтобы проверить, что оно истинно и не пусто:

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

Скажите, что вы на самом деле имеете в виду, попросив компьютер притвориться умнее, чем он, что приводит к странным неожиданностям.1006 * Возможно, вы могли бы изменить представление об истинности ТТ , но я не думаю, что вам понравится это или различные неприятные побочные эффекты, с которыми вы, вероятно, столкнетесь.Template Toolkit не является HTML Template Pro, когда в Риме делают то же, что и римляне, и все такое.

Лучше всего исправить ваши шаблоны и рассматривать дополнительную работу как часть процесса переноса.Вы, вероятно, могли бы создать плагин, чтобы делать «истинные и непустые» вещи для вас.

11 голосов
/ 03 февраля 2011

Я думаю .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
0 голосов
/ 03 февраля 2011

Проверка путем доступа к 1-му элементу массива:

[% IF ( ARRAY_REF.0 ) %]
...