Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »
реклама
Мебель для балкона okna-alma.ru для оформления закрытых балконов.

Почтовая рассылка

Подписчиков: 11850
Последний выпуск: 19.06.2015

Шаблоны документов и 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"};

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
22 февраля 2006, 13:19:09
Лучше всего использовать CGI::FastTemplate. Достаточно возможностей, не использует XS.
2.
Аноним
Мне нравитсяМне не нравится
13 февраля 2006, 02:23:50
Два недостатка:
1. скорость. Каждый раз генерить скрипт из шаблона...
2. шаблоны не содержат динамических значений.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог