4

这是一个关于 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命令行上指定的值。(它看到 aenable_networking为假并将其设置为 -1)

是否有任何简单的解决方法(可能是一些配置变量?)

4

2 回答 2

2

要检查变量是否未定义,您可以检查其size方法是否返回大于 0 的值。当然,这种情况仅适用于变量未初始化或根本未定义的情况(enable_networking = ''大小 = 1,与 相同enable_networking = 0

要检查变量是否为假...嗯...首先您必须描述哪种类型的值是假的。

在这种情况下,我会将 size = 0(或 size 不存在)视为未定义,-1 为假,其他一切为真:

[% 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 = ''as FALSE 与 -1 一起使用

编辑2:

好的,在评论之后我找到了一个解决方法:TRY-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
于 2020-02-25T01:57:19.843 回答
1

TT 中的所有标量值都有一个.definedvmethod。

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

这在手册中进行了讨论。

于 2020-02-27T09:01:50.767 回答