如何在 Perl 模板工具包中区分 false 值和定义的值



这是一个关于 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

问题是区分定义的值和假值。我尝试在DEFAULT块和[% IF enable_networking == -1 %]语句中使用-1(而不是0)。

但是,以下DEFAULT

[% DEFAULT enable_networking = -1 %]

将覆盖在命令行上指定的值0。(它看到一个enable_networking为假并将其设置为 -1)

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

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

要检查变量是否不为假...井。。。首先,您必须描述值的类型是否为 false。

在这种情况下,我将 size = 0(或大小不存在)视为未定义,-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

即使您不声明[% DEFAULT enable_networking = -1 %],输出也会-- a comment, variable enable_networking not provided

编辑 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 一起使用为 FALSE

编辑2:

好的,在评论之后,我找到了一种解决方法:TRY-CATCH指令...

对于值可以为 0 的可选变量,目标是TRY将变量值设置为自身,如果定义了变量,则将分配值,否则我们将CATCHundef 错误并设置默认值。对于任何其他类型的变量,我们可以使用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

TT 中的所有标量值都有一个.defined的虚拟方法。

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

这在手册中进行了讨论。

相关内容

  • 没有找到相关文章

最新更新