Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> require обрабатывает файлы с ошибками со 2 раза 
:(
    Опции темы
sir_nuf_nuf
Дата 27.5.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Ситуация:
Нужно проверить наличие и загрузить модуль имя которого заранее неизвестно.

Обычное решение
Код

sub load_module {
    eval "require $_[0]";
}


Но как выяснилось это решение работает только 1 раз !

Пример:

1) Создаем "модуль" с... синтаксическими ошибками. 
Код

dd if=/dev/random of=Module.pm count=1


2) Пытаемся его загрузить 2 раза подряд:
Код

$_ = 'Module';
print eval "require $_", "\n";
print eval "require $_", "\n";


3) Второй print выводит 1 !

Кто объяснит почему и как этого избежать ?

P.S. 
Изначально проблема возникла под mod_perl, но как выяснилось и в обычном скрипте она тоже есть
Если файла Module.pm вообще нет, т.е. его не удалось найти - то все ок, оба require не срабатывают.



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Pfailed
Дата 27.5.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Код

eval "require $_"
    or delete $INC{$_};




--------------------
PM MAIL   Вверх
arto
Дата 27.5.2011, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# perl -le 'print eval "require aa"; print eval "require aa"'


# 

ловите $@, чистите %INC
PM MAIL ICQ   Вверх
Pfailed
Дата 27.5.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Точнее delete $INC{"$_.pm"}.  Там путь до модуля, двоеточия заменяются на слеши.

Не знаю как в mod_perl, но в stand alone оба  раза false.
Код

$_ = 'Module';
eval "require $_"
    or warn $@;

eval "require $_"
    or warn $@;


Цитата

Unrecognized character \xF3; marked by <-- HERE after <-- HERE near column 1 at Module.pm line 1.
Compilation failed in require at (eval 1) line 2.

Attempt to reload Module.pm aborted.
Compilation failed in require at (eval 2) line 2.




--------------------
PM MAIL   Вверх
DurRandir
Дата 27.5.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Это багофича. require при отсутсвии модуля (и если тот не вернёт истину) не добавляет его в %INC, а в случае ошибки компиляции - добавляет. Поэтому надо его оттуда убирать. И возникает занимательная задача - в %INC имена модулей на в виде Foo::Barr, a Foo/Bar.pm. И если модуль загружен не относительно текущей директории - там будет вообще абсолютный путь.
PM   Вверх
Pfailed
Дата 27.5.2011, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(DurRandir @  27.5.2011,  14:24 Найти цитируемый пост)
И если модуль загружен не относительно текущей директории

Это как?


--------------------
PM MAIL   Вверх
sir_nuf_nuf
Дата 27.5.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Кстати наблюдаю это в 5.8.8  ,  в 5.12 - уже нет.. в промежуточных - не знаю..


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
DurRandir
Дата 27.5.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



>Pfailed

Сначала вставил много вывода, а потом понял, что перепутал ключ со значением)


>sir_nuf_nuf 
У меня тоже 5.8.8 smile Значит, признали багом.

Это сообщение отредактировал(а) DurRandir - 27.5.2011, 14:40
PM   Вверх
Pfailed
Дата 27.5.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(DurRandir @  27.5.2011,  14:24 Найти цитируемый пост)
там будет вообще абсолютный путь. 

Нет в вашем примере абсолютного пути.  'Data/Dumper.pm' не абсолютен.


--------------------
PM MAIL   Вверх
sir_nuf_nuf
Дата 27.5.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Ок, вообщем считаю это багом 5.8.8,  пишу костыль..

Всем спасибо!


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0803 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.