Прежде всего, ваши данные не действительны perl. Во-вторых, итерация по хешу дает вам (Java-подобные) «входные» объекты. Так что 'st' => {key => 'name', value => 'svu'}. Таким образом, st.name
ничто.
Это больше похоже на то, что вы хотите (или что работает, в любом случае):
name:
[% university.name %]
location:
[% university.location %]
studentdata:
[%- FOREACH student IN university.branch.electronics.student %]
student name=[% student.name %] number=[% student.number %]
[%- FOREACH semester IN student.semester %]
semester number=[% semester.number %] subjects=[% semester.subjects
%] rank=[% semester.rank %]
[%- END -%]
[%- END -%]
И мне пришлось изменить «семестр» на ученике № 12, чтобы он был массивом, и снять число с заглавной буквы. Вот что у вас было:
'semester'=>{
'Number'=>'1',
'subjects'=>'7',
'rank'=>'1'
}
Вот что я изменил:
'semester'=>[{
'number'=>'1',
'subjects'=>'7',
'rank'=>'1'
}]
Без семестра в виде массива вы просто повторяли этот тип вещи снова:
( { key => 'number', value => '1' }
, { key => 'subjects', value => '7' }
, { key => 'rank', value => '1' }
)
И не обязательно (или даже вероятно ) в этом порядке.
Используя правильно закрытый $var1
в качестве данных, код, который я поместил выше, дает мне:
\documentclass[a4paper,leqno,twoside]{article}
\begin{document}
name:
svu
location:
ravru
studentdata:
student name=xxx number=12
semester number=1 subjects=7 rank=1
student name=xxx number=15
semester number=1 subjects=7 rank=10
semester number=1 subjects=7 rank=1
student name=xxx number=16
semester number=1 subjects=7 rank=2
semester number=2 subjects=4 rank=2
\end{document}
Для отладки вашего скрипта вы можете внести следующие изменения:
my $template = Template->new( { EVAL_PERL => 1 } );
И затем, где вы хотите увидеть структуру, к которой обращаетесь, сделайте это:
[% RAWPERL %]
use Data::Dumper ();
print Data::Dumper->Dump( [ $stash->get( 'semester' ) ], [ 'semester' ] ), "\n";
[% END %]
Вы быстро увидите, когда в хеше в семестре отсутствуют поля чисел, предметов или рангов.
(Отвечая на комментарий) Ну, если у вас есть несколько учеников с адресами, как у некоторых, вы можете сделать следующее:
[% IF student.address;
addr = student.address; %][%-
-%]Address: [% addr.lines.1 %]
[% addr.lines.2 %]
[% addr.city %], [% addr.state %] [% addr.zip %]
[% END %]
Или, если у вас есть хэш адресов, вы можете сделать следующее.
[% IF address_for_student.exists( student.number );
address = address_for_student.item( student.number );
%]
...
[% END %]
(отвечая на новую адресную часть вопроса)
Вы можете массировать ваши данные перед презентацией. Это то, что я предлагаю до передачи данных на уровень представления. (Здесь $studentaddres
- это просто ссылка на структуру в тайнике.)
$studentaddres->{by_student_number}
= { map { $_->{number} => $_ } @{ $studentaddres->{address} }}
;
Затем в слое презентации вы можете просто сделать это:
[% address = studentaddres.by_student_number.item( student.number );
IF address %]
...
[% END %]
В общем, у вас должны быть ссылки, которые вам нужны до на уровень представления, что делает уровень представления просто вопросом отображения данных.
XML хранит вашу модель. Хорошо. XML прекрасно работает с деревьями, но не слишком хорошо строит сложные графики. Поэтому, если у вас сложные отношения (а XML :: Simple не собирается знать что-нибудь о них), вы должны использовать этот тип алгоритмической модели: retrieve & rarr; ссылка & rarr; дисплей . Вы должны сделать это с помощью YAML, JSON или даже строк, извлеченных из базы данных, поэтому этап связывания для меня является второй натурой.
Уровень представления - это неправильный уровень для поиска . Он должен просто обрабатывать списки из 0, 1 или многих или простых случаев, например, существует связь или нет.