Устранение неполадок в приложении Perl CGI - не удается найти метод объекта «новый» через пакет - PullRequest
0 голосов
/ 01 ноября 2018

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

Я наткнулся на контрольно-пропускной пункт и ищу совет о том, как устранить ошибку, которую я получаю.

Это ошибка:

Can't locate object method "new" via package "CGI" at 
/opt/app/htdocs/lib/APP/CGI.pm line 26.Compilation failed 
in require at /opt/app/htdocs/lib/APP/CGI.pm line 4.

Вот первые 26 строк /opt/app/htdocs/lib/APP/CGI.pm:

 package APP::CGI;

 use CGI;

 use CGI::Carp qw(fatalsToBrowser set_message);
 use APP::Error;

 BEGIN {
      sub handle_errors {
         my $msg = shift;
         &APP::Error::error($msg);
     }
     set_message(\&handle_errors);

 }

 use strict;
 # hack:  added these to resolve "can't locate" errors
 use lib qw(/opt/app/htdocs);
 use lib qw(/opt/app/htdocs/lib);
 use lib qw(/opt/app/htdocs/lib/APP);
 use lib qw(/opt/app/htdocs/lib/APP/Service);
 # end hack
 use vars qw/ $CGI %REDIRS /;

 $CGI = new CGI();

Мне нужно было добавить следующее в другие скрипты в приложении, чтобы заставить вещи работать (чтобы решить не могу найти ошибки), поэтому я добавил их в этот скрипт, но это не решило проблему ,

 use lib qw(/opt/app/htdocs);
 use lib qw(/opt/app/htdocs/lib);
 use lib qw(/opt/app/htdocs/lib/APP);
 use lib qw(/opt/app/htdocs/lib/APP/Service);

Я предполагаю, что мое приложение не может найти модуль CGI (в коде указано «use CGI;»). Я подтвердил, что модуль CGI установлен и обновлен:

 cpanm -i CGI
 CGI is up to date. (4.40)

Версия Perl 5.26.2, если это имеет значение.

Какие-либо советы по устранению неполадок? Мне кажется, что этот файл CGI.pm не может найти модуль CGI, поэтому он не может выполнить метод "new" ... но это всего лишь предположение.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Ваши use lib строки слишком перегружены. Вы добавляете несколько путей в начало @INC, но вам нужно только добавить базовый каталог. use CGI; будет искать @INC для первого найденного файла, добавив CGI.pm к пути, это найдет /opt/app/htdocs/lib/APP/CGI.pm из-за добавленных вами дополнительных путей. Очевидно, что это не CGI и не определяет пакет CGI, поэтому для него нет способа new. Ваш путь к lib, скорее всего, /opt/app/htdocs/lib.

0 голосов
/ 01 ноября 2018
package APP::CGI;

[…]

use lib qw(/opt/app/htdocs/lib);
use lib qw(/opt/app/htdocs/lib/APP);
use lib qw(/opt/app/htdocs/lib/APP/Service);

Эти use lib строки выглядят действительно неправильно. Если этот шаблон использовался и в других файлах, он приведет к разрешению use CGI в /opt/lib/htdocs/lib/APP/CGI.pm (т. Е. К файлу, который вы просматриваете!), А не к стандартному модулю , который был предназначенный.

Удалите все use lib строк из модулей Perl (.pm) в вашем проекте. Эта директива должна появляться только в скриптах Perl верхнего уровня (.pl, .cgi, и т. Д. ); даже там должен быть только один use lib, относящийся к каталогу lib вашего проекта, а не к каким-либо подкаталогам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...