这是一个关于 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
将变量值设置为自身,如果定义了变量,则将分配值,否则我们将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
TT 中的所有标量值都有一个.defined
的虚拟方法。
[% IF hostname.defined %] hostname = [% hostname %][% ELSE %][% -- a comment, variable hostname not provided %][% END %]
这在手册中进行了讨论。