Автор Тема: mod_perl и проверка модуля  (Прочитано 2562 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн xmolex

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 75
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
mod_perl и проверка модуля
« : 21 Октября 2008, 12:36:25 »
Здравствуйте. Знакомлюсь с mod_perl и в связи с этим возник вопрос, как правильно сделать проверку возможности подгрузить модуль.
Есть скрипт bee.cgi, к которому обращаются через веб. Есть модуль engine.pm, который находится в поддиректории lib/, т.е. путь относительно bee.cgi ./lib/engine.pm. Хочется сделать грамотную обработку модуля и если его не возможно загрузить, чтобы в браузер вывелось мое сообщение об ошибке. Сейчас у меня есть рабочий вариант, но выглядит он крайне непрофессионально:
#!/usr/bin/perl -w
use strict;
use 
CGI qw(:all);

BEGIN
 
{
   
unshift @INC$ENV{DOCUMENT_ROOT};
 }

BEGIN {
 eval { require 
lib::engine; };
 if ($@)
  {
    print 
header;
    print
"Don\'t open module \'lib/engine.pm\' in \'$ENV{DOCUMENT_ROOT}\'";}
 else
  {
    use 
lib::engine;
    
my$text main();
    print 
header;
    print 
"|$text|";
  }}

Как видите приходится использовать два блока BEGIN. Если обойтись одним блоком, то в @INC не добавляется моя директория. Если второй блок просто убрать, то будет ошибка, т.к. "use lib::engine" выполняется на этапе компиляции (его может и не быть), а проверка на этапе выполнения. Повторюсь, пример рабочий, но хотелось бы чистоты и этичности кода. У меня не получилось добиться этого, как я не пытался.

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
mod_perl и проверка модуля
« Ответ #1 : 21 Октября 2008, 19:39:52 »
eval "use lib::engine";

или

lib::engine->import ();

Оффлайн xmolex

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 75
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
mod_perl и проверка модуля
« Ответ #2 : 22 Октября 2008, 16:21:51 »
Большое спасибо, остановился на следующем варианте:
#!/usr/bin/perl -w
use strict;
use 
CGI qw(:all);

BEGIN
 
{
   
unshift @INC$ENV{DOCUMENT_ROOT};
 }

if (eval (
"use lib::engine; 1"))
  {
    
my$text main();
    print 
header;
    print 
"|$text|";
  }
else
  {
    print 
header;
    print
"Don\'t open module \'lib/engine.pm\' in \'$ENV{DOCUMENT_ROOT}\'";
  }
« Последнее редактирование: 22 Октября 2008, 16:37:27 от xmolex »

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28