Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу).
Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Homepage Карта сайта Версия для печати

Джентльменский набор Web-разработчика   Ларри Уолл о Perl6   Наблы Система Orphus
 

9. Внедрения HTML в код на Perl (второй шаг),  или ох уж мне этот XML

[6 ноября 2001 г.]

  Компиляция, компиляция —
У меня к тебе антипация...

Чтобы хоть как-то выправить слог

Настает знаменательный момент. Сейчас мы общими усилиями добавим в Perl поддержку «внедренного» HTML, наподобие того, как это уже сделано в PHP. Для этого потребуется материал предыдущих набл, особенно восьмой, пятой и четвертой.

Сначала определимся, что же мы хотим. Вместо того, чтобы начинать формулировать требования (укороченный рабочий день, бесплатный доступ в Интернет и т. д.), я лучше приведу небольшой пример скрипта-страницы (допустим, с именем /test.htm), которая должна работать. Как именно она будет работать — думаю, объяснять не надо.

Листинг 1
<html><body>
<h1>Привет!</h1>
Это ваш адрес: $ENV{REMOTE_ADDR}<br>
А это — текущее время: <?=scalar(localtime)?><br>
Не хотите ли посчитать до 10?<br>
<?for(my $i=1; $i<=10; $i++) {?> 
   <li>Цифра $i: 
   $i * $i = <?print $i*$i?> 
<?}?> 
Ну а теперь произошла ошибка:
<?warn "Ошибка!\n"?>
Пожалуй, на сегодня хватит.
<body></html>

В предыдущей набле рассказывалось о модуле Apache::Scriptor::Simple, который позволяет самостоятельно и весьма удобно создавать конвейеры-обработчики для тех или иных документов. Возможно, вы уже догадались, что механизм обработки шаблонов будет реализован именно как обработчик Apache::Scriptor.

Чайник 

Все, стоп. Если вы до этого не изучили восьмую наблу, читать дальше бессмысленно.

Для начала установим модуль CGI::Embedder, умеющий обрабатывать шаблоны со вставками Perl-кода внутрь HTML. Как обычно, он доступен по адресу http://dklab.ru/chicken/mod/cpan (для Unix), или http://dklab.ru/chicken/mod/ppd (для Windows).

Чайник 

Если вы не знаете, как устанавливать модули, отправляйтесь читать пятую наблу.

Затем напишем обработчик, поместив его в /_Kernel/handlers/s_eperl.pl:

Листинг 2
use CGI::Embedder;
sub s_eperl
{  my ($input)=@_;
   -f $ENV{SCRIPT_FILENAME} or return -1;
   print CGI::Embedder::Expand(
     $input,
     undef,
     $ENV{SCRIPT_FILENAME}
   );
   return 0; # OK
}

Лирическое отступление 
Как работает CGI::Embedder::Expand()? Первым делом она превращает (компилирует) весь шаблон в серию вызовов print, так, чтобы HTML-текст оказался «в кавычках», а весь код, заключенный в <?...?>, — наоборот, вне. Затем полученная программа запускается с помощью eval. Вы можете сказать, что фаза компиляции занимает время. Да, это так, но практика показывает, что даже для очень больших страниц издержки весьма незначительны.

После этого осталось лишь указать Apache и Apache::Scriptor, что мы хотим задействовать обработчик для всех файлов с расширением htm. В файле /.htaccess напишем знакомые по предыдущей набле строки:

Action     s_eperl "/_Kernel/Scriptor.pl"
AddHandler s_eperl .htm
Action     s_copyright "/_Kernel/Scriptor.pl"
AddHandler s_copyright .htm # куда же мы без копирайта...

Вот и все. Теперь ваш Perl настолько же удобен с точки зрения внедрения кода в HTML, насколько PHP.

Лирическое отступление 
Между прочим, синтаксис шаблонов CGI::Embedder даже более удобен, чем синтаксис PHP. А именно, теперь вы можете вставлять значения переменных в код, просто указав их имя: $var (если нужно вывести просто доллар, поставьте перед ним слэш: \$100). В PHP для этого следует писать: <?=$var?>. Впрочем, CGI::Embedder поддерживает и такой синтаксис тоже.

Используя CGI::Embedder и CGI::WebIn, вы можете выполнять те же задачи, которые обычно решали на PHP. И напоследок — все описанное здесь в динамике: http://dklab.ru/chicken/nablas/demo/scriptor/.

Лирическое отступление 
На этом цикл набл о «низкоуровневом» программирвании на Perl завершен, а поставленная задача (добавить в Perl все удобства PHP) выполнена. Остался только один вопрос. При чем тут вообще XML (см. название наблы)? А упомянул я его потому, что тэги <? и ?> используются и там для служебных целей. В общем, «шаблоны — это вам не XML».

 
Рекламный блок
   

Важное объявление:
    автор категорически против копирования и распространения в Интернете всех статей «Куроводства» с возрастом, меньшим 6 месяцев. Печальный опыт «расползания» чрезвычайно устаревших ошибочных версий статьи про Apache действительно объясняет такое решение.

Орфография на «Куроводстве»:
    если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Выделенный текст будет немедленно отослан вебмастеру, а Вы даже ничего и не заметите — настолько быстро все произойдет.

На заметку:
    если вы уже вскипели насчет дизайна этой страницы, то присмотритесь повнимательнее к названию, почитайте FAQ, сходите по лебедевским местам, как это уже предлагалось выше. Можно ли считать пародию плагиатом? Надеюсь, что нет.

Параметры этой страницы
   
GZip

Ссылки от спонсоров
   


Дмитрий Котеров | 6 ноября 2001 г. ©1999-2016 | Генеральный спонсор: Хостинг «Джино» | Контакт Вернуться к оглавлению