我继承了一个旧的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.
Run Code Online (Sandbox Code Playgroud)
这是/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();
Run Code Online (Sandbox Code Playgroud)
我一直不得不将以下内容添加到应用程序中的其他脚本以使工作正常(解决无法找到错误),所以我在这个脚本中添加了它们,但它还没有解决问题.
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);
Run Code Online (Sandbox Code Playgroud)
我的猜测是我的应用程序无法找到CGI模块(在代码段中引用为"使用CGI;").我已确认CGI模块已安装并且是最新的:
cpanm -i CGI
CGI is up to date. (4.40)
Run Code Online (Sandbox Code Playgroud)
如果重要的话,Perl版本是5.26.2.
有关如何排除故障的任何提示?我觉得这个CGI.pm文件找不到CGI模块,这就是为什么它不能执行"new"方法...但它只是一个猜测.
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);
Run Code Online (Sandbox Code Playgroud)
这些use lib线看起来真的错了.如果此模式也用于其他文件,它将导致use CGI解析为/opt/lib/htdocs/lib/APP/CGI.pm(即您正在查看的文件!),而不是预期的标准模块.
从项目中的Perl模块()中删除所有 use lib行.pm.该指令应只出现在顶级的Perl脚本(.pl,.cgi,等); 即使在那里,也应该只有一个use lib引用lib项目的目录,而不是任何子目录.