如何在Template Toolkit中取消引用哈希?

时间:2013-08-29 09:08:12

标签: perl reference perl-data-structures template-toolkit

我有以下问题:我有一个哈希引用数组,我想渲染。

$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,但使用->{}结果解析器错误。

这是否可能或我出错了什么?

编辑:数据结构的背景: 该计划执行以下操作:

  1. 解析包含表格的HTML文件
  2. 在解析时,将表的每一行读入一个哈希值(nice_key s是表的单元格)并将这些哈希值存储到哈希哈希值中(让我们称之为tabledata)< / LI>
  3. 执行一些数据库查询并将其添加到内部哈希值(例如原始HTML文件中不存在nicest_key
  4. 以与以前相同的顺序输出HTML表格。
  5. 为了保留原始表的顺序,我在步骤2中填充了tablerows数组,并引用了内部哈希值。

    编辑2:我的意图: enter image description here

    箭头表示对散列的引用。

    我如何填写这些数据

    my %tabledata = ();
    my @tablerows = ();
    foreach (... parsing ...) {
      ...
      $tabledata{$current_no} = ();
      push @tablerows, \$tabledata{$current_no};
    
      $tabledata{$current_no}{$row} = $value;
    }
    

    当我转发其中的每一个%tabledata@tablerows时,内容似乎对我而言。

2 个答案:

答案 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'
  };
...