|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/14343d861ae4.html, оценка из 5, голосов 10
|