模板工具包和复杂变量

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】:

感谢您在示例中使用了著名的 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 %]

【讨论】:

以上是关于模板工具包和复杂变量的主要内容,如果未能解决你的问题,请参考以下文章

可协作的原型设计工具(附行业模板素材)

PL/SQL Developer 开发工具技巧总结

标准app基础模板建立-活动管理-定时服务-键值对存储-日志工具

如何反转模板工具包中的匿名列表?

Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布

JEasyPoi 2.1.4 (Jeecg订制) 版本发布,Excel 和 Word 简易工具类