Template-Toolkit和复杂变量

时间:2011-11-10 23:25:25

标签: perl catalyst template-toolkit

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

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

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

访问它

非常感谢所有帮助,我有点像Perl newb,所以如果有什么不合适的地方,请告诉我。提前谢谢......

5 个答案:

答案 0 :(得分:11)

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

[% foo.bar.0.id %]

答案 1 :(得分: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 %]

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

的内容
[% foo.bar.0.id() %]

看看是否有效。

答案 4 :(得分:0)

您是否可以在现有代码中的某处设置名为foo的本地TT变量?如果发生这种情况,你可以获得一些神秘的结果,这符合“我同意这应该有效;但事实并非如此”。

检查此方法的一种方法是明确foo,即:

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

如果这会产生结果,那么你在某处就会遇到命名空间问题。