Не удается найти Connection.pm в @INC (@INC содержит: /usr/local/lib/perl/5.14.2 /etc/perl /usr/local/share/perl/5.14.2) в ./select.cgi на линии

Я впервые пробую свои силы в -> Apache - Perl (CGI) на Ubuntu.

Сервер Apache нормально работает в папке /var/www для файла index.html по умолчанию. Но поскольку я хочу запустить CGI-скрипт, я также установил (на всякий случай) DBI, как предлагают некоторые форумы. Я установил разрешения для полного доступа к моей папке cgi-bin, в которой находится скрипт select.cgi. Я несколько раз пытался настроить скрипт select.cgi, перенаправляя библиотеку в библиотеку Perl, но безрезультатно. Я изменил файл httpd.conf и указал путь к папке select.cgi. Это не сработало. Я также определил ScriptAlias и установил его в рабочий каталог. Это тоже не сработало. У кого-нибудь есть полезные указатели. Спасибо.


person Benny    schedule 14.09.2012    source источник


Ответы (2)


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

Я полагаю, вы сказали, что путь к модулю

/usr/lib/perl5/vendor_perl/5.8.5/foo/bar/Connection.pm

и что вы получили сообщение об ошибке (с добавленными разрывами строк):

Can't locate foo/bar/Connection.pm in @INC (@INC contains:
   /etc/perl
   /usr/local/lib/perl/5.14.2
   /usr/local/share/perl/5.14.2
   /usr/lib/perl5
   /usr/share/perl5 
   /usr/lib/perl/5.14
   /usr/share/perl/5.14
   /usr/local/lib/site_perl
   .
   /usr/lib/perl5/vendor_perl/5.8.5/foo/bar/
) at ...

Вы сделали что-то вроде

use foo::bar::Connection;

or

require "foo/bar/Connection.pm";

Перл искал

  • /etc/perl/foo/bar/Connection.pm
  • /usr/local/lib/perl/5.14.2/foo/bar/Connection.pm
  • ...
  • /usr/lib/perl5/vendor_perl/5.8.5/foo/bar/foo/bar/Connection.pm

Но ни один из них не

/usr/lib/perl5/vendor_perl/5.8.5/foo/bar/Connection.pm

Это просто исправить. Добавьте в свой скрипт следующее:

use lib '/usr/lib/perl5/vendor_perl/5.8.5'; 

Другое возможное исправление - использовать

 use Connection;

вместо

 use foo::bar::Connection;

Какое исправление является правильным, зависит от того, как выглядит эта строка package в модуле. Если вы найдете package foo::bar::Connection;, вам нужно изменить @INC (как показано с помощью директивы use lib, for example). If you findpackage Connection;, you need to change theuse`.

person ikegami    schedule 14.09.2012
comment
Я пытаюсь написать свой комментарий, но пробел в 600 символов слишком мал, и, следовательно, он не позволяет мне писать свои изменения и последующие ошибки. Позвольте мне попробовать, сокращая свой ответ - person Benny; 15.09.2012
comment
@ikegami-я добавил BEGIN { push(@INC,'/usr/local/lib/perl/5.14.2');} в свой файл select.cgi. В 5.14.2 у меня есть папки foo/bar/Connection. В файле сценария select.cgi у меня есть строки use foo::bar::Connection;. Ошибки, которые я получил на этот раз, были: readMainConfFile: ERROR: Searched for a conf file and couldn't find it. Perhaps you need to create one in /var/www/../conf/foo/psat.conf. Compilation failed in require at /usr/local/lib/perl/5.14.2/foo/bar/Connection.pm line 15. BEGIN failed--compilation aborted at /usr/local/lib/perl/5.14.2/foo/bar/Connection.pm line 15. - person Benny; 15.09.2012
comment
Эта новая ошибка не связана с исходной и не связана с Perl, а скорее связана с вашим кодом или модулем, который вы используете. - person ikegami; 15.09.2012
comment
Спасибо. По крайней мере, теперь я знаю, что это не из Perl. Я постараюсь отладить это. Спасибо еще раз. - person Benny; 15.09.2012

Это не совсем то решение, которое вам нужно, но общая идея выглядит так, как показано ниже.

Как решить Cant locate xxxx.pm in @INC path проблему

По умолчанию perl ищет модули в пути к стандартной библиотеке и в текущем каталоге. Иногда вам нужно использовать некоторые модули, которые устанавливаются в нестандартных местах; Есть несколько способов справиться с этой ситуацией:

Чтобы проверить, находится ли ваш модуль в пути @INC, используйте.

Пример:

perl -e 'use SOAP::Lite;'
perl -e 'use Error;'

Если вы запустите эти команды в системе, в которой установлены SOAP::Lite и Error, Perl просто вернется из этих команд без вывода каких-либо результатов.

Чтобы проверить текущий стандартный путь к библиотеке, используйте:

perl -le 'print foreach @INC'

Если у вас есть административные привилегии, лучшим решением будет установить модуль по любому пути к библиотеке, определенному системой.

Установите переменную среды PERL5LIB Perl будет искать модули в каталогах, указанных в переменной среды PERL5LIB, прежде чем искать в стандартной библиотеке и текущем каталоге. Таким образом, вы можете установить эту переменную для поиска ваших модулей.

Пример:

# For unix like systems
PERL5LIB=/home/path/lib:/usr/another/path/lib; export PERL5LIB

Примечание. разделяйте каталоги двоеточием в Unix и точкой с запятой в Windows.

ЕСЛИ вы запускаете свой код из командной строки, используйте параметр -I. Синтаксис должен быть примерно таким.

perl -I /home/path/lib -I /usr/another/lib script.pl

И вы также можете добавить путь к библиотеке в свой скрипт

Команда для включения пути в ваш скрипт: используйте lib path.

Пример:

#!/usr/bin/perl
use lib "/home/path/lib";
use lib "/usr/another/lib";

use MyCustomModule;
person Suvasish Sarker    schedule 14.09.2012
comment
Спасибо. Я на самом деле пробовал выше. Не исправил. Я не знаю, где я иду не так. - person Benny; 15.09.2012