Как различить ложные и определенные значения в Template Toolkit для perl - PullRequest
3 голосов
/ 25 февраля 2020

Это вопрос о Template Toolkit для perl.

. Я рендерил свои шаблоны с помощью небольшой утилиты командной строки, у которой включена следующая опция

   DEBUG => Template::Constants::DEBUG_UNDEF,

Синтаксис: render <file.tt> var1 val1 var2 val2 .... Это очень удобно, поскольку пользователь получает подсказки о значениях, которые необходимо определить, например,

$ render file.tt
undef error - var1 is undefined

$ render file.tt var1 foo 
undef error - var2 is undefined

$ render file.tt var1 foo var2 bar
... template renders correctly

Для некоторых (необязательных) значений шаблоны предоставляют значения по умолчанию, например:

[%- DEFAULT
    hostname = 0
%]

Тогда тело шаблона обычно будет содержать:

  [% IF hostname %] hostname = [% hostname %][% ELSE %][% -- a comment, variable hostname not provided %][% END %]

Как заставить работать описанную выше идиому для переменных, где 0 является допустимым значением?

Я хочу следующее случиться:

render template.tt

Визуализация шаблона:

  -- this is a comment, variable enable_networking not provided

Для

  render template.tt enable_networking 0

Я хочу

  enable_networking = 0

Проблема заключается в различении определенные значения и ложные значения. Я попытался использовать -1 (вместо 0) как в блоке DEFAULT, так и в операторе [% IF enable_networking == -1 %].

Однако следующий DEFAULT блок

[% DEFAULT enable_networking = -1 %]

заменит значение 0, указанное в командной строке. (Он видит enable_networking ложно и устанавливает его в -1)

Есть ли какие-либо простые обходные пути (возможно, какая-то переменная конфигурации?)

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Все скалярные значения в TT имеют .defined vmethod.

[% IF hostname.defined %] hostname = [% hostname %][% ELSE %][% -- a comment, variable hostname not provided %][% END %]

Это обсуждается в руководстве .

1 голос
/ 25 февраля 2020

Чтобы проверить, является ли переменная неопределенной или нет, вы можете проверить, возвращает ли ее метод size что-то большее, чем 0. Конечно, этот случай применим, только если переменная не инициализирована или не определена вообще (enable_networking = '' имеет размер = 1, то же самое с enable_networking = 0)

Чтобы проверить, не является ли переменная ложной ... ну ... сначала вы должны описать, какой тип значения ложен.

В этом case я приму size = 0 (или размер не существует) как неопределенный, -1 как false и все остальное как true:

[% IF enable_networking.size and enable_networking != -1 %]
    enable_networking = [% enable_networking %]
[% ELSE %]
    -- a comment, variable enable_networking not provided
[% END %]

С кодом выше, если вы запустите

render template.tt enable_networking 0

Вывод будет enable_networking = 0

И если вы запустите

render template.tt

Вывод будет -- a comment, variable enable_networking not provided, даже если вы не объявите [% DEFAULT enable_networking = -1 %]

РЕДАКТ. 1:

Для этой работы лучше подходит метод length:

[% IF enable_networking.length and enable_networking != -1 %]
    enable_networking = [% enable_networking %]
[% ELSE %]
    -- a comment, variable enable_networking not provided
[% END %]

Использование length вместо size также позволяет вам использовать enable_networking = '' как ЛОЖЬ вместе с -1

РЕДАКТИРОВАТЬ 2:

Хорошо, после комментариев я нашел обходной путь, который делает трюк: * 10 41 * - CATCH директивы ...

Для необязательных переменных, которые могут иметь значение 0, целью будет TRY установка значения переменной для себя, если переменная определена, значение будет присвоено иначе мы CATCH ошибка undef и установим значение по умолчанию. Для любого другого типа переменной мы можем использовать директиву DEFAULT:

[% DEFAULT
    hostname = 0
%]
[% TRY %] [% enable_networking = enable_networking %] [% CATCH %] [% enable_networking = -1; %] [% END %]

hostname = [% hostname %]
[% IF enable_networking != -1 AND enable_networking.length %] enable_networking = [% enable_networking %][% ELSE %]-- variable enable_networking not provided[% END %]

С этим новым шаблоном, если вы запустите

$ render template.tt
hostname = 0
-- variable enable_networking not provided

$ render template.tt enable_networking ""
hostname = 0
-- variable enable_networking not provided

$ render template.tt hostname myhost enable_networking 0
hostname = myhost
enable_networking = 0
...