【问题标题】:Can I find out if variable is an array using Template Toolkit?我可以使用 Template Toolkit 找出变量是否是数组吗?
【发布时间】:2013-04-03 21:26:16
【问题描述】:

我将多选框的结果传递到页面,以便可以在屏幕上显示选择。由于它是多选的,因此结果可以是标量或数组引用。有没有办法找出来?我在网上找不到任何东西,但我认为可能有一个 .array.array_ref 令牌可用于验证。 我正在使用模板工具包、Perl 和 Dancer。

这就是我得到的标量:

<% IF multitext %>
    Text: <% multitext %>
<% END %>

我想要的是……

<% IF multitext %>
    <% IF multitext.array_ref %> <!-- whatever works! -->
        <% FOREACH text IN multitext %>
            Text: <% text %>
        <% END %>
    <% ELSE %>
        Text: <% multitext %>
    <% END %>
<% END %>

【问题讨论】:

    标签: html template-toolkit


    【解决方案1】:

    如果&lt;%- multitext.0 -%&gt; 返回一个非零值,它就是一个数组引用。

    如果 &lt;%- multitext.keys.size -%&gt; 返回一个非零值,它就是一个 hashref。

    我通常处理它的方式是如果它是一个标量,则强制它是一个数组,例如:

    <%- SET items = multitext.0 ? multitext : [ multitext ];
        FOREACH item IN items;
            ...
        END; -%>
    

    【讨论】:

    • RET,您的语句“如果 ... 返回一个非零值,它是一个 arrayref”,并不完全正确。它也可能是一个 hashref。根据 Template Toolkit 文档,在 hash(ref) 上使用 'size' 方法“返回散列中键/值对的数量”。不过,multitext.0 效果很好。
    • 好点,毛里茨,虽然问题是专门的数组或标量值。我已经修改了一般情况的答案。
    • 如果数组的第一个元素为假(或零),&lt;%- multitext.0 -%&gt; 将返回假(或零),因此这不是一个完美的解决方案。
    • 没错,但如果您的multitext 是一个标量数组,其中第一个元素可以使用defined 方法为空白/零,也很容易解决,例如:[%- SET items = multitext.0.defined ? multitext : [ multitext ];跨度>
    【解决方案2】:

    几年后……

    您可以使用 .list vmethod 来保证它是一个数组,例如

        <% FOREACH text IN multitext.list %>
            Text: <% text %>
        <% END %>
    

    http://template-toolkit.org/docs/manual/VMethods.html#section_list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 2013-01-23
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多