![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| sir_nuf_nuf |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Ситуация:
Нужно проверить наличие и загрузить модуль имя которого заранее неизвестно. Обычное решение
Но как выяснилось это решение работает только 1 раз ! Пример: 1) Создаем "модуль" с... синтаксическими ошибками.
2) Пытаемся его загрузить 2 раза подряд:
3) Второй print выводит 1 ! Кто объяснит почему и как этого избежать ? P.S. Изначально проблема возникла под mod_perl, но как выяснилось и в обычном скрипте она тоже есть Если файла Module.pm вообще нет, т.е. его не удалось найти - то все ок, оба require не срабатывают. |
||||||
|
|||||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# perl -le 'print eval "require aa"; print eval "require aa"'
# ловите $@, чистите %INC |
|||
|
||||
| Pfailed |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Точнее delete $INC{"$_.pm"}. Там путь до модуля, двоеточия заменяются на слеши.
Не знаю как в mod_perl, но в stand alone оба раза false.
|
||||
|
|||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Это багофича. require при отсутсвии модуля (и если тот не вернёт истину) не добавляет его в %INC, а в случае ошибки компиляции - добавляет. Поэтому надо его оттуда убирать. И возникает занимательная задача - в %INC имена модулей на в виде Foo::Barr, a Foo/Bar.pm. И если модуль загружен не относительно текущей директории - там будет вообще абсолютный путь.
|
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Это как? |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Кстати наблюдаю это в 5.8.8 , в 5.12 - уже нет.. в промежуточных - не знаю..
|
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
>Pfailed
Сначала вставил много вывода, а потом понял, что перепутал ключ со значением) >sir_nuf_nuf У меня тоже 5.8.8 Это сообщение отредактировал(а) DurRandir - 27.5.2011, 14:40 |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Нет в вашем примере абсолютного пути. 'Data/Dumper.pm' не абсолютен. |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Ок, вообщем считаю это багом 5.8.8, пишу костыль..
Всем спасибо! |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |