模板工具包和复杂变量
Posted
技术标签:
【中文标题】模板工具包和复杂变量【英文标题】: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 新手,所以如果有什么不合适的地方,请告诉我。提前谢谢...
【问题讨论】:
【参考方案1】:感谢您在示例中使用了著名的 foo 和 bar 方法/键。
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 %]
【讨论】:
以上是关于模板工具包和复杂变量的主要内容,如果未能解决你的问题,请参考以下文章
标准app基础模板建立-活动管理-定时服务-键值对存储-日志工具