1

次の問題があります。レンダリングしたいハッシュへの参照の配列があります。

$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 %]-line は のようなものを出力しますがREF(0x74a0160)、他の 2 行は空白です。

これを理解する限り、rowを呼び出すにはテンプレート内の変数を逆参照する必要がありますrow.nicer_keyが、->またはを操作{}するとパーサー エラーが発生します。

これは可能ですか、それとも何が間違っていますか?

編集:データ構造の背景:プログラムは次のことを行います:

  1. テーブルを含む HTML ファイルを解析する
  2. 解析中に、テーブルのすべての行をハッシュ ( nice_keys はテーブルのセル) に読み取り、これらのハッシュをハッシュのハッシュに格納します (それを と呼びましょうtabledata)
  3. いくつかのデータベース クエリを実行し、これらを内部ハッシュに追加します (たとえばnicest_key、元の HTML ファイルには存在しませんでした)。
  4. 前と同じ順序で HTML テーブルを出力します。

元のテーブルの順序を維持するために、tablerows手順 2 で内部ハッシュへの参照を配列に入力しました。

Edit2:私が意図したこと: ここに画像の説明を入力

矢印はハッシュへの参照を表しています。

これらのデータをどのように入力したか

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

  $tabledata{$current_no}{$row} = $value;
}

それらのそれぞれをダンプする%tabledata@tablerows、コンテンツが正しいように思えます。

4

2 に答える 2

3

コメントが言うように (そして、私がこれを書いているときにあなた自身で発見しました)、あなたの中心的な問題は、あなたのハッシュが余分なレベルの参照を深く埋めすぎていることです。最初にそれを修正するように努力する必要があります。

投稿タイトルの実際の質問に答えるために、私の知る限り、Template Toolkit はハッシュの逆参照を強制する機能をネイティブに提供していませんが、追加することは可能です。

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 として実装しようとしましたが、失敗しました。ポインタはありますか?

于 2013-08-29T10:41:27.433 に答える