我继承了一个旧的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.
这是/opt/app/htdocs/lib/APP/CGI.pm的前26行:
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”方法的原因……但这只是一个猜测。
答案 0 :(得分:6)
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
(即您正在查看的文件!),而不是the standard module
从项目中的Perl模块(use lib
)中删除所有行.pm
。该指令只能出现在顶级Perl脚本中(.pl
,.cgi
, etc );即使在那里,也应该只有一个use lib
指向项目的lib
目录,而不是任何子目录。
答案 1 :(得分:2)
您的use lib
行太急了。您正在向@INC
的开头添加一堆路径,但是只需要添加基本目录即可。 use CGI;
将在路径中添加@INC
,从而在CGI.pm
中搜索找到的第一个文件,由于您添加了额外的路径,因此将找到/opt/app/htdocs/lib/APP/CGI.pm
。显然,这不是CGI,也没有定义CGI包,因此没有new
方法可在其中找到。您的lib路径可能只是/opt/app/htdocs/lib
。