2013-08-29 2 views
1

У меня есть следующая проблема: у меня есть массив ссылок на хеши, которые я хочу отобразить.Как хэши разыменования в 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 %] -line выводит что-то вроде REF(0x74a0160), но остальные две строки просто пустым.

Насколько я понимаю это, row переменных в шаблоне должен быть разыменовывается для того, чтобы вызвать row.nicer_key, но работать с -> или {} приводит к синтаксической ошибке.

Возможно ли это, или что я ошибаюсь?

Edit: Предпосылки структуры данных: Программа выполняет следующие действия:

  1. Разобрать файл HTML с таблицей в нем
  2. В процессе анализа, читать каждую строку таблицы в хэш (nice_key s являются ячейками таблицы) и сохраняют эти хеши в хэш хешей (давайте назовем его tabledata)
  3. Выполняем некоторые запросы к базе данных и добавляем их во внутренние хеши (например, nicest_key нет в исходном HTML-файле)
  4. Выведите таблицу HTML в том же порядке, что и раньше.

Для сохранения порядка исходной таблицы я заполнил массив tablerows на шаге 2 со ссылками на внутренние хеши.

Edit2: Что я намеченный: 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 содержание кажется мне правильным.

+6

Ваша проблема заключается в том, что ваш массив не содержит ссылок на хеши, а ссылки на ссылки на хеши. – flesk

+0

Хорошо, но это означает, что я также смогу разыменовать эти вложенные ссылки. Или нет? – contradictioned

+3

Почему ваш массив выглядит в первую очередь? Вероятно, вы немного увлеклись ссылкой на вещи в своем коде Perl. – flesk

ответ

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

Как говорят комментарии (и вы узнали самостоятельно, когда я пишу это), ваш основной проблемой является то, что ваши хэши захоронены один лишний уровень ссылки слишком глубоко. Вы должны сначала исправить это.

Теперь, чтобы ответить на актуальный вопрос в названии поста, AFAIK Шаблон 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 

Я на самом деле пытался реализовать это как скалярный метод и не удалось. Любые указатели?

Смежные вопросы