Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
Имитационное мо... 60728
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

Пользователей: 13,122
новичок: BenderSergey1969
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Программа тестирования (тест) - вступительные экзамены (математика, физи...
Моделирование работы аэропорта на GPSS + Пояснительная записка
Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Шаблоны документов и Perl
Всегда, когда нам необходимо написать CGI скрипт на Perl мы сталкиваемся с тем, что скрипт должен возвращать пользователю некоторый HTML код. Как правило, этот код вставляется непосредственно в код самого скрипта. Данный подход не совсем удобен в том плане, что при изменении дизайна сайта, как правило, приходится изменять текст скрипта. Вы наверно замечали, что очень часто "скриптовая" часть сервера несколько отличается от остальной части сайта. Происходит это именно по той причине, что в самом коде скрипта довольно сложно изменять HTML фрагменты. Где-то да просчитаетесь.

Второй, наиболее популярный, вариант - это вынесение переменных с HTML в отдельный файл. Это конечно облегчает жизнь, но не дает полной свободы. Предложенный ниже скрипт состоит всего лишь из 30 строк, но зато он решает все описанные выше проблемы.

Итак, для начала решим, что все наши HTML данные будут храниться в файле - шаблоне. Назовем его html.dot Формат файла будет следующий:

#! Название_фрагмента
# Комментарий
Любой текст
#! Название_второго_фрагмента
Еще текст

Кроме того, в тексте можно использовать такие конструкции:

  • @Имя@ - подставить значение переменной "Имя"
  • @#Имя@ - подставить фрагмент с названием "Имя". Заметьте, что подстановка идет рекурсивно и в подставляемых блоках, так же можно использовать подстановки.

Теперь напишем функцию, которая читала бы читала этот файл, преобразовывала его (делала подстановки фрагментов) и сохраняла фрагменты в хеше. При этом, имена элементов хеша, будут соответствовать именам фрагментов.

 sub read_from_dot{
1    my (@lines, $line, $curname);
2    open (F, "$_[0]") || die "Can't open file $_[0]";
3    while ($line=){
4        chomp($line);
5        if (( $line !~ /^#[^!]/ ) && ( $line ne "#" )){
6          if ($line =~ /^#!\s+/){
7              $curname=$';}
9        else{
10            $DOT{$curname}.="$line\n";
          }
        }
     }
14   close(F);

16  foreach (keys %DOT){
17        $DOT{$_} =~ s/@#(.[^@]*)@/$DOT{"$1"}/g;
    }
}
  • 2 - Открываем файл. Имя файла должно быть передано как аргумент функции.
  • 3 - Пробегаем по всем строчкам файла.
  • 4 - Избавляемся от символа конца строки.
  • 5 - Если строка начинается с "#" (причем после нее стоит не "!"), то работаем с ней. Иначе - теряем. Поскольку это комментарий.
  • 6 - Если строка начинается на "#!", значит это название очередного фрагмента.
  • 7 - Запомним имя текущего фрагмента.
  • 9-10 - Если это просто строка, добавляем ее в элемент хеша с именем равным имени текущего фрагмента.
  • 14 - Закрываем файл.

Процедура рекурсивной подстановки

  • 16 - Пробегаем по всем элементам хеша %DOT.
  • 17 - Заменяем все конструкции вида @#NAME@ на текст фрагмента с именем "NAME".

Вот и все. У нас готов глобальный хеш %DOT, в котором содержатся все наши шаблоны.

Возьмем для примера такой файл-шаблон:

#! MAIN
###########################################
@#TITLE@
Это главная страница

#! STYLE
###########################################
<STYLE>
H1 {color: red}
</STYLE>

#! TITLE
#
# @STRING@ - имя
###########################################
<HTML>
<HEAD>
@#STYLE@
<TITLE>@STRING@</TITLE>
</HEAD>
После обработки получим хеш из трех элементов MAIN, STYLE, TITLE.

Ну и наконец напишем функцию, которая будет подставлять значения переменных. Что бы переменные не пересекались с переменными, используемыми в скрипте, будем хранить их в хеше %DOT_VAL.

 sub insert_values{
1    if ($_[0]){
2        $_[0] =~ s/@(.[^@]*)@/$DOT_VAL{$1}/g;
     }
     else{
5        foreach (keys %DOT){
6            $DOT{$_} =~ s/@(.[^@]*)@/$DOT_VAL{$1}/g;
         }
     }
 }
  • 1 - Если функция вызывается с аргументом, то замена переменных происходит в этом аргументе. Иначе замена переменных происходит во всем хеше $DOT.
  • 2 - Подстановка переменных.
  • 5 - Бежим по всем элементам хеша %DOT
  • 6 - Подставляем значения переменных.
Ну и на последок пример использования данного кода.
read_from_dot("html.dot");
$DOT_VAL{STRING}="Welcome to our site!!!";
insert_values();
print $DOT{"MAIN"};
Опубликовал Kest Октябрь 31 2008 18:54:13 · 0 Комментариев · 5830 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Программа для рис...
Proeffectimage
FatScrollbar
DFileDeleter
Защита от спама ...
Delphi. Готовые а...
FreeNet
Род Стивенс. Delp...
PHP: обучение на ...
База каталогов ( ...
Dreamsoft Progres...
Dynamic Titles дл...
Интерактивный инт...
Создание оригинал...
Пишем программы и...
Добавление к ссы...
Программирование ...
Создание лабиринт...
Scrrlcaptoin
Технология .Net в VB

Топ загрузок
Приложение Клие... 100532
Delphi 7 Enterp... 92109
Converter AMR<-... 20103
GPSS World Stud... 15495
Borland C++Buil... 13112
Borland Delphi ... 9186
Turbo Pascal fo... 7115
Калькулятор [Ис... 5216
Visual Studio 2... 5037
FreeSMS v1.3.1 3561
Случайные статьи
Упражнения по рабо...
Поиск
Работа с Outlook к...
Вспышка Canon - т...
Аккуратно работаем...
7.6. Представле...
Русские новинки
Форматы цифрового ...
В современных сист...
Специфика построен...
Вам захотелось чег...
ПОЛИМОРФНЫЕ АССОЦИ...
UNIX предъявляет р...
2-32)
Планируя агенты во...
Заказ презентации
Основы перетаскива...
File not open
Как проиндексирова...
Проверка состоятел...
TMemoryStream
Ввод строк
Каждый DNS-сервер ...
Ограничение возмож...
Выигрышные качеств...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?