Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Alex Dedul                           2:450/82       16 Sep 2002  19:17:43
 To : All
 Subject : __DATA__ blocks & use
 -------------------------------------------------------------------------------- 
 
 
 Помню когда-то , 16 Sep 02 в 18:56, Andrey Sapozhnikov напиcал для Artem
 Chuprina нижecлeдyющee:
 [...]
 
  >> А, я не заметил той тонкости, что у тебя это DATA скрипта, а не
  >> модуля... Hе уверен, может и не получиться.
 
  AS> Если обращение к main::DATA из CHECK {...} по каким-то причинам
  AS> слишком поздно для Вас,
 
     Поздно, в итоге после перебора BEGIN, CHECK, END подошло INIT, т.к. только
 тут мы имеем доступ к скрипту(к ::DATA) до того, как он начал выполняться и
 после выполнения import в модуле.
 
  AS> то оформите ваш модуль как фильтр (в
  AS> реальности ничего и не фильтрующий) см. perldoc perlfilter. И будете
  AS> иметь возможность поглазеть в содержимое вызывающего скрипта еще на
  AS> стадии его компиляции. Только постарайтесь потом не перехитрить
  AS> собственный парсер выражениями типа:
 
  AS> print <<__XXX__;
  AS> __DATA__
  AS> __XXX__
  AS> __DATA__
 
     Спасибо, именно так в конце концов и сделал, хотя уже был готовый модуль,
 который читал скрипт из файла. Если есть интересующиеся деталями, далее
 описываю как чего делал.
 
     Сперва для чего это вообще надо. Захотелось мне переделать свой небольшой
 движок для сайтов с cgi на fastcgi. Как известно для того, чтобы старые
 cgi-скрипты работали под ним, их необходимо немного подправить таким образом,
 чтобы само тело скрипта находилось в цикле обработки запросов. Может быть это и
 подходящий способ, но не наш ж). Тут-то и возникла идея посмотреть, что нам
 может предложить перл для того, чтобы избежать переписывания скриптов. Сначала
 думал просто добавлять в скрипты после подключения модулей __DATA__, читать его
 содержимое и потом eval-ить все что там будет в цикле обработки запросов и даже
 сделал так. Hо тонкость тут была в том, что мой модуль помимо eval-а исходного
 скрипта еще экспортит некоторые полезные функции в него плюс надо было
 предусмотреть, чтобы была возможность подключать другие модули в скрипте и
 иметь доступ к их функциям. Именно поэтому скрипт пришлось обернуть в 'package
 main;'+$data_content. Теперь надо подобрать место откуда евалить. BEGIN не то,
 еще не экспортятся функции. Пробуем END - оно, функии экспортнуты, все есть,
 тут и оставил, тут оно и заработало и была это версия 0.1.
     Потом посмотрел на все это и подумал, а зачем нам __DATA__ если можно и без
 нее обойтись, раз уж все равно сами читаем содержимое скрипта. Переделал,
 теперь стало eval-ить то, что находилось сразу после подключения модулей. Hо
 вылезла другая проблема - скрипт стал выполняться 2 раза - первый раз в самом
 скрипте, другой - в нашем модуле в eval. Пришлось искать замену блоку END.
 Перекинул все в import, сразу после экспорта функций модуля, хотя с тем же
 успехом все можно было положить в INIT. Казалось бы все идеал достугнут, все
 довольны и все работает, так нет же, тут прочитываю твое письмо про фильтры и
 нас ждут еще изменения и под них. Теперь никаких дополнительных файловых
 операций, в фильтре построчно складываем скрипт и после достижения конца файла
 передаем управление в цикл обработки запросов, где уже и eval-им. Итого
 получили, что в исходные скрипты не надо вносить абсалютно никаких изменений и
 их можно пускать как под plain-cgi так и под fast-cgi. Хе, это руль ж)
     Вот теперь я и успокоился, убив на все это целый день. Зато доволен и еще
 как, но больше всего конечно чувство восторга и удивления тем, что перл
 оказался еще более гибким и мощным, нежели я знал его предыдущих 4 года ж).
 
     Все, большое спасибо тебе, Dmitry Smolin и Artem Chuprina, без вас я бы
 колупался еще с пару дней наверное ж).
 
 WBR, Alex
 winamp$ my downloads - morcheeba - Otherwise <stopped>
 --- GoldED+/W32 1.1.4.7
  * Origin: Iron Hills Lab. (2:450/82)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 __DATA__ blocks & use   Alex Dedul   15 Sep 2002 13:12:08 
 __DATA__ blocks & use   Dmitry Smolin   15 Sep 2002 23:24:28 
 __DATA__ blocks & use   Alex Dedul   16 Sep 2002 12:38:04 
 __DATA__ blocks & use   Dmitry Smolin   16 Sep 2002 15:44:36 
 __DATA__ blocks & use   Alex Dedul   16 Sep 2002 17:55:04 
 Re: __DATA__ blocks & use   Artem Chuprina   16 Sep 2002 00:19:10 
 __DATA__ blocks & use   Alex Dedul   16 Sep 2002 12:46:14 
 Re: __DATA__ blocks & use   Artem Chuprina   16 Sep 2002 18:04:45 
 Re: __DATA__ blocks & use   Andrey Sapozhnikov   16 Sep 2002 18:56:29 
 __DATA__ blocks & use   Alex Dedul   16 Sep 2002 19:17:43 
 Re: __DATA__ blocks & use   Andrey Sapozhnikov   16 Sep 2002 22:24:42 
 __DATA__ blocks & use   Alex Dedul   16 Sep 2002 22:25:14 
Архивное /ru.perl/14343d861ae4.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional