我有以下问题:我有一个哈希引用数组,我想渲染。
$VAR1 = \{
'nice_key' => undef,
'nicer_key' => '0',
'nicest_key' => 'Miller'
};
$VAR2 = \{
'nice_key' => undef,
'nicer_key' => '0',
'nicest_key' => 'Farns'
};
$VAR3 = \{
'nice_key' => undef,
'nicer_key' => '0',
'nicest_key' => 'Woodstock'
};
...
我将此作为\@tablerows
传递给模板。我在模板内做:
[% FOREACH row = tablerows %]
<tr>
<td>[% row %]</td>
<td>[% row.nicer_key %]</td>
<td>[% row.nicest_key %]</td>
</tr>
[% END %]
[% row %]
- 行输出REF(0x74a0160)
,但其他两行只是空白。
据我了解,模板中的row
变量必须取消引用才能调用row.nicer_key
,但使用->
或{}
结果解析器错误。
这是否可能或我出错了什么?
编辑:数据结构的背景: 该计划执行以下操作:
nice_key
s是表的单元格)并将这些哈希值存储到哈希哈希值中(让我们称之为tabledata
)< / LI>
nicest_key
)为了保留原始表的顺序,我在步骤2中填充了tablerows
数组,并引用了内部哈希值。
编辑2:我的意图:
箭头表示对散列的引用。
我如何填写这些数据
my %tabledata = ();
my @tablerows = ();
foreach (... parsing ...) {
...
$tabledata{$current_no} = ();
push @tablerows, \$tabledata{$current_no};
$tabledata{$current_no}{$row} = $value;
}
当我转发其中的每一个%tabledata
和@tablerows
时,内容似乎对我而言。
答案 0 :(得分:3)
正如评论所说的那样(你在我写这篇文章时你自己发现了),你的核心问题是你的哈希被埋没了一个多余的引用程度。你应该努力解决这个问题。
现在回答帖子标题中的实际问题,AFAIK模板工具包本身不提供强制哈希解除引用的工具,但添加一个是可行的:
my @array = ( \{ nice_key => undef, nicer_key => '0', nicest_key => 'Miller'} );
Template->new->process( \<<EOT, { deref => sub{${+shift}}, tablerows => \@array } );
[% FOREACH row = tablerows %]
<tr>
<td>[% row %]</td>
<td>[% deref(row) %]</td>
<td>[% deref(row).nicer_key %]</td>
<td>[% deref(row).nicest_key %]</td>
</tr>
[% END %]
EOT
我实际上试图将其作为标量vmethod实现并失败。有什么指针吗?
答案 1 :(得分:1)
好的,我发现了问题:
$tabledata{$current_no} = ();
push @tablerows, \$tabledata{$current_no};
在我的代码中,现在我已经
了$tabledata{$current_no} = {};
push @tablerows, $tabledata{$current_no};
这意味着,我有一个哈希引用而不是哈希上下文中的列表,这就是我想要的。
导致以下转储(注意,没有对引用的引用),并且模板被正确解析。
$VAR1 = {
'nice_key' => undef,
'nicer_key' => '0',
'nicest_key' => 'Miller'
};
$VAR2 = {
'nice_key' => undef,
'nicer_key' => '0',
'nicest_key' => 'Farns'
};
$VAR3 = {
'nice_key' => undef,
'nicer_key' => '0',
'nicest_key' => 'Woodstock'
};
...