Ковыряю mod_perl. Казалось бы чего проще? Вроде бы под CGI много лет успешно пишу, в том числе и на perl, но как бы не так! С самого начала заподозрил что не всё так просто. Да и привычные схемы в привычной обстановке стали спотыкаться, ё-моё. Оказывается, а) модперл заворачивает пишимый скрип в сабрутинг handler, который и запускает. А отсюда вытекают многие весьма неожиданные последствия. Во-первых, описанные функции оказываются вложенными, во-вторых локальные переменные, которые описаны вне этих функций и должны быть им видимы теряют свою привычную природу. В результате при пользовании их функцией порождается одноимённая переменная локальная, но статическая, с которой (а не с той что описана) функция и работает. А поскольку перл-среда продолжает жить собственной жизнью, то и значение её оказывается доступная разным реинкарнациям скрипта. Этот эффект можно было бы с пользой применить, если бы не многотредовая работа апача: в каждой нитке свои переменные. Ну, до "variable X will not stay shared" в логах я не успел дойти, а эмпирически вычислил каким образом нельзя юзать переменные. Сначала меня, конечно, озадачили "subroutine Y redifined at ...". Прописал как-то сразу их глобальными, да ещё и в модуле. Воот. А б) поскольку среда продолжает непрерывно жить, то подгруженные однажды модули, прописанные штатным путём, весьма несподручно обновлять... В общем, такое непривычное и непредсказуемое поведение просто кричало о том, что mod_perl - это не просто CGI и для него есть свои требования, первые из которых я уже вычислил. Не заметил в какой момент написания скрипта в error.log стали вываливаться громадные портянки переопределённых констант. В ModPerl::Util.pm, который я не вызываю. То есть это где-то в ядре его... Не с первого раза нашёл солюшн, а именно: в апачевый конфиг нужно добавить:
<Perl>
$ModPerl::Util::DEFAULT_UNLOAD_METHOD = 'unload_package_xs';
</Perl>
Когда совсем надоело вычислять что ещё не так и как писать "как надо", пошёл искать ума-разума у гугля. Нашёл не сразу. У O'Reilly (кто бы мог подумать? ;)): "Practical mod_perl". Чем вполне доволен - сижу, знакомлюсь. Пока не без удовлетворения нашёл подтверждение своих догадок по многим пунктам.