Простите меня, если этот вопрос уже был задан и / или ответил где-то еще.
Прежде чем я начну, я должен указать, что природа этого запроса может не требовать добавления кода в эту ветку, скорее, ответом может быть просто ссылка на документацию модуля Template Toolkit с комментарием «ПРОЧИТАЙТЕ ЭТО СНОВА» :). Чтобы быть еще более ясным, я бы согласился на краткий ответ ДА или НЕТ.
Скажем, у меня есть рабочий Perl-скрипт, который без проблем обрабатывает шаблоны Template :: Toolkit.
Но один из моих шаблонов содержит «имена» (имена людей, имена серверов, в конце концов, это действительно не имеет значения: просто «имена»). Эти имена используются в дальнейшем для создания ФАЙЛОВ, содержащих обработанные данные.
Сегодня у меня это работает с помощью следующего псевдокода:
$template->process('names.tt','output.txt');
Затем я беру сгенерированный список «имен» в «output.txt» и помещаю их в массив в том же исполняемом сценарии Perl. Этот список затем используется итеративным образом для вывода данных, указанных в другом шаблоне, и дает имя каждому результирующему файлу на основе исходного «имени»:
foreach(@names){
my $filename = $_ . '.txt';
$template->process('profile_doc.tt',$filename)
}
Как я уже сказал, все работает нормально (на самом деле идеально). Моя проблема в том, что он без нужды раздувает мой код (нужно управлять открытыми FH и т. Д.). Должен быть лучший способ, учитывая необычайные способности TT.
Итак, я начал читать о включенных модулях Template :: Toolkit (например, STASH, PROVIDER и т. Д.). Я понимаю, что, например, STASH позволяет вам вводить данные в существующий объект модуля шаблона в качестве дополнительного средства, однако это полярная противоположность того, что я хочу сделать.
Мой настоящий вопрос (опять же, ДА или НЕТ подойдет как ответ с точки зрения того, возможно это или нет):
Возможно ли, чтобы сценарий Perl прочитал шаблон, скажем, содержащий объект HASH, хранящийся в Template-Toolkit, и создать новый HASH, который можно использовать на самом деле? Сценарий Perl (например: вне шаблона)?
Если бы это было возможно, это избавило бы от необходимости извлекать данные запутанным образом из одного шаблона и использовать эти данные для обработки другого шаблона. Скорее, теоретически я мог бы сделать следующее без необходимости вручную заполнять список, который нужно записать на диск, а затем снова прочитать через FH.
foreach(sort keys $derivedhash{obj}){
$filename = $_->{name} . '.txt';
$template->process('profile_doc.tt',$_->{name});
}
Спасибо, пожалуйста, поймите, что я сделал все возможное, чтобы создать удобную псевдомодель, поскольку реальный код содержит конфиденциальные элементы и, к сожалению, не допускает раскрытия. Надеюсь, ты поймешь. При необходимости я могу предоставить другие «очищенные абстракции / примеры».
ОБНОВЛЕНИЕ
В ответ пользователю ikegami:
Во-первых, спасибо за ответ.
Хорошо, давайте начнем с одного из ваших комментариев: «... что не имеет смысла, поскольку TT не хранит хеши» ... Хм ... Если мы не говорим о двух разных вещах, это неверно, поскольку я делаю это сегодня ... например, вот объект, размещенный в шаблоне, который содержит элементы начального хеша, о котором я говорил:
[%- SERVERS = [
{entry={
NAME => 'Server1'
SERIAL => '1234567890'
DESC => 'A file server'
}}
{entry={
NAME => 'Server2'
SERIAL => '0987654321'
DESC => 'An account server'
}}
]-%]
Еще раз, вышеперечисленное работает, и оно ДЕЙСТВИТЕЛЬНО существует в TT ........... и, если я не ошибаюсь, вышеперечисленное, безусловно, выглядит, ощущается и на вкус как хеш ... Даю вам, тем не менее, что он заключен в массив ... так что, возможно, это не 100% -ный "чистый объект HASH", но я, безусловно, ДЕЙСТВИТЕЛЬНО использую его как хеш (и довольно красиво).
Прежде чем вы что-то скажете, я уже понимаю, что мне, скорее всего, придется обновить имена ключей, чтобы они были УНИКАЛЬНЫМИ для упрощения анализа (хеш-ключи сами по себе должны быть уникальными), но это отдельная задача. .
Вы были правы, когда сказали: «Очевидно, вы хотели спросить не об этом». Позвольте мне прояснить последний вопрос, как вы и просили:
Может Template Toolkit из исполняемого сценария Perl прочитать «Шаблон 1», который содержит единственный объект HASH (как описано выше), и прочитать указанную структуру HASH в новом strong> хэш-объект, который существует только в указанном исполняемом скрипте (в отличие от самого шаблона)? Этот «новый хеш» в конечном итоге будет использоваться для имен файлов, созданных «шаблоном 2».
Наконец, чтобы удовлетворить вашу последнюю просьбу:
Вышеприведенный отрывок из входных данных обеспечивает «входные данные», которые вы запрашивали. Я хочу получить истинный хеш Perl, полученный из данных внутри вызываемого шаблона.
Итак, как эквивалент Perl (желаемый ВЫХОД):
%newhash = (
entry => {
NAME => "Server1",
SERIAL => "1234567890",
DESC => "A file server"
},
.... other entries ....
);
.... будет использоваться для "подачи" определенных значений, например значений "NAME", в другие шаблоны, обработанные "позже".
Я надеюсь, что это проясняет путаницу ... еще раз спасибо ikegami ...
process()
, и сгенерированный вывод будет передан как параметр; затем вы можете записать вывод и одновременно проанализировать его, не читая файл снова. Однако это все еще кажется довольно окольным. - person ThisSuitIsBlackNot   schedule 18.04.2016names.tt
, должно быть написано на Perl. Perl может делать все, что умеет TT, и многое другое. Похоже, что шаблон не принимает параметров и поэтому просто создает имена, комбинируя буквальные строки; это правильно? - person Borodin   schedule 18.04.2016INCLUDE
для получения информации изnames.tt
и других файлов? Мне кажется, вы должны использовать файл JSON для хранения такой информации. Он расшифровывается как объектная нотация JavaScript, и хотя он возник как формат для литералов данных на языке JavaScript, он стал полезным форматом для передачи данных между языками. Существуют библиотеки Perl, Python и Ruby для его чтения, и вам следует поискать модуль PerlJSON
- person Borodin   schedule 18.04.2016process
вместо возможностиINCLUDE
напрямую, но я все еще не понимаю, делаете ли вы это когда-либо - person Borodin   schedule 18.04.2016