说我使用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,所以如果有什么不合适的地方,请告诉我。提前谢谢......
答案 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 %]
如果这会产生结果,那么你在某处就会遇到命名空间问题。