【问题标题】:Template-Toolkit and complex variables模板工具包和复杂变量
【发布时间】:2011-12-26 15:13:22
【问题描述】:

假设我正在使用 Catalyst 在 Perl 中工作。我将一个哈希数组分配给一个变量,即:

my @array = ($some_hash); 
$c->stash->{foo}->{bar} = \@array;

如何从Template Toolkit 中的$some_hash 中选择一个元素,例如'id'?在 Perl 中,我可以通过 $c->stash->{foo}->{bar}->[0]->id... 访问它。

非常感谢所有帮助,我是一个 Perl 新手,所以如果有什么不合适的地方,请告诉我。提前谢谢...

【问题讨论】:

    标签: perl catalyst template-toolkit


    【解决方案1】:

    感谢您在示例中使用了著名的 foobar 方法/键。

    TT 中的一个问题是 VMethod 名称和哈希键的冲突。您的键名是否可能与内置的 TT VMethods 之一冲突? .first.last.length 甚至 .keys 都是这个候选者,there are probably others

    这可能会导致意想不到的结果,尤其是当您抛出 Automagic Promotion of Scalar to List for Virtual Methods 行为时。

    解决这个问题的方法是使用item()VMethod,即:

    [% foo.item("bar").0.id %]
    

    【讨论】:

      【解决方案2】:

      您是否可能在现有代码的某处设置了一个名为foo 的本地TT 变量?如果发生这种情况,您可能会得到一些神秘的结果,类似于“我同意这应该有效;但它没有”。

      检查这一点的一种方法是使您的foo 明确,即:

      [% c.stash.foo.bar.0.id %]
      

      如果这产生了结果,那么你在某个地方遇到了命名空间问题。

      【讨论】:

        【解决方案3】:

        由于$some_hash 似乎受到您在 perl 中访问它的方式的祝福,我会尝试类似的方法

        [% foo.bar.0.id() %]
        

        看看是否可行。

        【讨论】:

          【解决方案4】:

          当您想弄清TT 中复杂数据结构中发生的情况时,以下类型的内容会很有帮助:

          [% USE Dumper; Dumper.dump_html(foo) %]
          

          ..看看TT认为你有什么样的数据:

          [% foo %]
          

          ...或者更远的兔子窝:

          [% FOREACH x IN foo.keys; 
          USE Dumper; Dumper.dump_html(foo.$x);
          foo.$x ; # to see what kind of ref it is
          END %]
          

          【讨论】:

          • 使用最后一个示例显示:"$VAR1 = 1; 1" 这不是我想要的。使用倒数第二个表明它是一个散列。使用第一个示例什么也不显示。
          • 是的,对不起。在 TT 中摆弄复杂的数据结构有点痛苦。但我们的想法是使用 Dumper 插件来计算出你有什么,并采取适当的行动。
          • foo.$x 返回 1 的事实(或 true,取决于您如何看待它)向我表明这可能是 VMethod 名称和哈希键问题的冲突 - 请参阅我的第二个答案...
          • 谢谢! - 这对我来说太棒了,老家伙,但当我试图建立一个哈希并遇到“问题”时,真的为我节省了大量时间。
          【解决方案5】:

          Template Toolkit 使用统一的语法来访问复杂结构的元素。这应该做你想做的:

          [% foo.bar.0.id %]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-15
            • 2011-11-27
            • 2014-11-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-25
            • 2011-05-18
            相关资源
            最近更新 更多