6

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

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

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

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

4

5 回答 5

12

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

[% foo.bar.0.id %]
于 2011-11-10T23:34:40.970 回答
5

当您想弄清楚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 %]
于 2011-11-10T23:56:57.177 回答
2

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

TT 中的一个问题是 VMethod 名称和哈希键的冲突。您的键名是否可能与内置的 TT VMethods 之一冲突?.first, .last,.length甚至.keys是这个的候选人,而且可能还有其他人

这可能会导致意想不到的结果,特别是当您为虚拟方法行为投入标量的自动提升到列表时。

解决方案是使用item()VMethod,即:

[% foo.item("bar").0.id %]
于 2011-11-21T03:37:51.220 回答
1

由于$some_hash您在 perl 中访问它的方式似乎很幸运,我会尝试类似的方法

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

看看这是否有效。

于 2011-11-14T19:33:22.913 回答
0

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

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

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

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

于 2011-11-21T03:25:59.633 回答