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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модуль подключения, подключение *.pm и вывод errors 
V
    Опции темы
comtat
Дата 19.6.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: нет
Всего: 71



тоесть в качестве параметров отдаем путь до директории с pm файлом
если пусто или Null то считаем что модуль системный
и второй параметр имя pm файла
если невозможно подключить (неправильный путь или неустановлен), вывод ошибки 

есть ли реализованные аналог loadlib(path, pm file) ?
если нет то как по правильному строить логику (как проверять и тп)

спасибо


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Ivan Kolesnikov
Дата 20.6.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: нет
Всего: 6



Код

use FindBin '$Bin';
use lib ("$Bin/lib", "D:\\Temp\\aaa\\b");


Для поиска модулей добавяться директории lib в директории со скриптом и еще одна директория, путь к которой задан абсолютно

В этих путях модули могут быть в каталогах, тогда имя модуля будет Dir1::Dir2::Name...
--------------------
PM MAIL ICQ   Вверх
Nab
Дата 21.6.2007, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 37



Я на днях окончил свой модуль который строит .packlist с использованием стандартного ExtUtils::Packlist, наподобие того что строит perl для своих модулей... на него вы можете глянуть в своей директории /usr/local/lib/perl/lib ну или c:\perl\lib, ну или где там у вас установлен перл smile

Мне этот модуль понадобился не только для того чтоб знать где какие модули находяться, но чтоб я мог, подключать их на ходу, хранить дополнительные параметры для файла, и для другого функционала.... потому как моя разработка юзает море модулей , и две системы плагинов smile и ессно они все в каждый момент времени не нужны, а подгружаються только необходимые...

А код загрузки модуля, по имени во время исполнения, а не на этапе компиляции таков:

Код

my $module = 'My_module::MySubmodule';
eval "use $module";
if ($@) {
  # Вот здесь можно написать свой обработчик ошибки, 
  # ну или просто заюзать die или warn, или методы из модуля Carp;
  die "Cannot load module $module, ERROR: $@"
}

Вообще-то там нюансов целое море... smile
Так что спрашивайте...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
comtat
Дата 10.9.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: нет
Всего: 71



Возвращаясь к сабжу.. сделал вот такую штуку
В качестве параметров отдается  Название библиотеки и имя модуля(программы, типа календарь и тд)
Если приходит только имя библиотеки, то ищу в глобальных библиотеках если нет то в системных perl
Если приходят оба параметра, то ищу локально в данном модуле
Код

sub LoadModule {
  my $libName   = shift; 
  my $module    = shift; 

  my @loadedLib;
  $module = "" unless ($module);
  
  foreach my $s (keys %INC) { 
     push(@loadedLib, $s); 
  } 
  
  my $error_str = "";
  if($module eq ''){
    my $userFileName = $$sys{libRoot}."/".$libName.".pm";
    my $perlFileName = $libName.".pm";
    if (-e $userFileName) {
      if (in_array($userFileName, \@loadedLib)) { return; }
      require $userFileName;
    } else {
      my $perlLib = "";
      foreach my $key (@INC) { 
        if (-e $key.'/'.$perlFileName) {
          $perlLib = $key.'/'.$perlFileName;
        } 
      } 
      if ($perlLib eq "") { $error_str = debugMsg("Not Load library in ".$userFileName, 1); }
      else {
        if (in_array($perlFileName, \@loadedLib)) { return; }
        require $perlFileName;
      }
    } 
  } else {
      my $userFileName = $$sys{sysRoot}."/".$module."/lib/".$libName.".pm";
      unless (-e $userFileName) {
        $error_str = debugMsg("Not Load library in ".$userFileName, 1);  
      }
      if (in_array($userFileName, \@loadedLib)) { return; }
      require $userFileName;
  }
  return;
}#LoadModule


Как и что тут можно и нужно доработать ??  


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Nab
Дата 10.9.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 37



Во первых нужно определиться что вы подразумеваете под названием библиотеки и под именем модуля, а лучше использовать общепринятые названия, имя модуля и имя файла.

Во вторых, это нонсенс заганять ключи хеша в массив, а потом проверять наличие его там с помощью левой функции, exists для кого существует? smile

В третьих думаю лучше писать системонезависимый код, и вместо вашего формирования путей вручную, нужно пользоваться 
File::Spec::catfile. Тогда слеши будут правильные, а возможно и не слеши если это Mac smile

В четвертых вызывать  require можно без проверки наличия в загруженных, перл его сам второй раз грузить не будет уж поверьте smile

В пятых, если у вас есть возможность того что имя модуля не верно, то подключать его лучше через eval, тогда и лишнее сканирование @INC не понадобиться.

А в шестых, это вообще все лишнее smile или вы думаете что такие проблемы только у вас ?
Есть модуль UNIVERSAL::require. Он добавляет каждому пакету метод use и require.

то есть вы можете во время исполнения подключить любой модуль так

MyLib::MyModule->use;
debugMsg("Not Load library ".$UNIVERSAL::require::ERROR) if $UNIVERSAL::require::ERROR;

или если импортирование не нужно то
MyLib::MyModule->require;
debugMsg("Not Load library ".$UNIVERSAL::require::ERROR) if $UNIVERSAL::require::ERROR;

там внутри уже все сделано и позволит избежать многих проблем.

Так как там идет переопределение UNIVERSAL, то я к примеру вызываю UNIVERSAL::require, только один раз в головном модуле, во всех остальных его звать не нужно, эти методы глобальны и будут работать везде...


То есть вся моя писанина сводиться к тому, что не стоит изобретать велосипед, а нужно сразу спрашивать, а есть ли модули с таким функционалом smile. Кстати я в любом случае, даже если вы не будете использовать UNIVERSAL::require, рекомендую глянуть как он устроен, он весьма мал, но достаточно оригинален...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
comtat
Дата 11.9.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: нет
Всего: 71



Цитата(Nab @  10.9.2007,  23:23 Найти цитируемый пост)
Во вторых, это нонсенс заганять ключи хеша в массив, а потом проверять наличие его там с помощью левой функции, exists для кого существует? 

Признаю ступил  smile 
Цитата(Nab @  10.9.2007,  23:23 Найти цитируемый пост)
В четвертых вызывать  require можно без проверки наличия в загруженных, перл его сам второй раз грузить не будет уж поверьте 

А этого незнал

Спасибо, за критику  smile 
перепишу с использованием UNIVERSAL::require

Это сообщение отредактировал(а) comtat - 11.9.2007, 22:09


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


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

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


 




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


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

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