2011-11-10 61 views
3

假设我在Perl中使用Catalyst。我分配散列数组的一个变量,即:模板工具包和复杂变量

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

如何选择从$ some_hash的元素,比如“身份证”,在Template Toolkit?在Perl中,我可以通过$c->stash->{foo}->{bar}->[0]->id来访问它...

所有的帮助是非常感谢,我是一个Perl新手,所以如果任何东西看起来不合适,请让我知道。在此先感谢...

回答

11

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

[% foo.bar.0.id %] 
+0

我同意,这应该工作;但它不... – danwoods

3

,当你想看看发生了什么事在复杂的数据结构中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 %] 
+0

使用最后一个例子显示:“$ VAR1 = 1; 1”这不是我正在寻找的。使用倒数第二个显示它是一个散列。使用第一个示例什么也不显示。 – danwoods

+0

是的,对不起。摆弄复杂的数据结构在TT中有点痛苦。但想法是使用Dumper插件来确定你有什么,并采取适当的行动。 – singingfish

+0

事实上,foo。$ x返回1(或者是真的,取决于你如何看待它),向我暗示这可能是VMethod名称和散列键问题的冲突 - 请参阅我的第二个答案... – RET

0

由于$some_hash似乎是从你访问它在Perl的方式祝福,我会尝试像

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

,看看是否可行。

0

是否有可能在您现有的代码中的某个地方设置了一个名为foo的本地TT变量?如果发生这种情况,你可以得到一些神秘的结果,如“我同意这应该起作用;但它不起作用”。检查此

的一种方法是使你的foo明确,即:

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

如果产生一个结果,那么你已经有了一个命名空间问题的地方。

2

我很感谢你在你的例子中使用了着名的foobar方法/键。

TT中的一个问题是VM方法名和散列键的冲突。您的密钥名称是否可能与内置的TT VM方法之一相冲突? .first,.last,.length或甚至.keys是这个的候选和there are probably others

这可能会导致意想不到的结果,特别是当您抛出Automagic Promotion of Scalar to List for Virtual Methods行为。

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

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