对于 Debian、Linux 和基于 sudo 的虚拟机来说是全新的。我最初想运行这个CGI文件(
printfile.cgi
):
#!/usr/bin/perl
use strict;
use CGI;
print "Content-type: text/html\n\n";
my $document_root = "/opt/lampp/htdocs/";
my $cgi = new CGI;
my $filename = $cgi->param('file');
my $filepath = $document_root.$filename;
open(FILE, $filepath);
my @file_in = <FILE>;
foreach(@file_in) {
print $_, "<br>\n";
}
close(FILE);
exit;
但是,我收到以下错误消息:
Can't locate CGI.pm in @INC
这是第一个问题,我无法查明原因,但我假设
CGI.pm
位于基于 /usr
的目录或 /opt
目录中。不管怎样,我知道我安装的 libcgi-pm-perl
位于错误的目录中(INC
正在期待它)
在寻找了一些解决方法1,2之后,我最初尝试使用上述链接中的use lib方法,但它只能找到一个
.pm
文件。
接下来,我尝试将分散的
/usr
和 /opt
文件夹中的文件复制到 @INC
中的文件夹中(我使用了 /etc/perl
)。
CGI文件需要的主要
.pm
文件是CGI、Request、Pool和APR。就 APR 而言,我确实在 CGI 文件中使用了 'use lib'
方法。修改成我现在用的这个版本:
#!/usr/bin/perl
use lib '/opt/lampp/lib/perl5/site_perl/5.34.1/x86_64-linux-thread-multi/'; # To look for APR.pm
use strict;
use APR;
use Request; (Request, Pool and CGI are in /etc/perl)
use Pool;
use CGI;
print "Content-type: text/html\n\n";
my $document_root = "/opt/lampp/htdocs/";
my $cgi = new CGI;
my $filename = $cgi->param('file');
my $filepath = $document_root.$filename;
open(FILE, $filepath);
my @file_in = <FILE>;
foreach(@file_in) {
print $_, "<br>\n";
}
close(FILE);
exit;
但是,在移动/复制
.pm
文件之间,我设法意外地将 APR.pm
复制到 /etc/perl
目录中,并将其重新复制回原始库/文件夹(我忘记了,抱歉)
不确定对 APR 文件的修改是否有任何作用,我在运行时收到了新的错误消息
printfile.cgi
:
APR.c: loadable library and perl binaries are mismatched (got handshake key 0xeb00080, needed 0xce00080)
我提到了这两个问题关于如何解决不匹配的问题,但对如何继续感到困惑:
如果我没记错的话,我必须重新安装
APR.pm
文件,也就是整个 libapache2-mod-perl2
包来纠正不匹配的情况。
我希望找到我的问题的答案,如果我听起来缺乏经验,我深表歉意。
您正在处理的库是“纯 Perl”模块(
.pm
文件)和 .xs
文件的组合。 XS 是“Perl 的语言扩展,可以包装 C 库使其成为 Perl 库”(SO 定义)。 “不匹配”错误意味着您用来运行脚本的进程使用的 Perl 版本与用于构建和安装包括 XS 在内的模块的版本不同。
这种情况在系统升级后经常发生,所有基于XS的模块都应该重新构建并重新安装。
此外,该系统上可能有许多 Perl 版本。一种可能是系统附带的 Perl,另一种可能是根据应用程序需要安装的 Perl。尝试调查像
/root/perl5/bin
或 /opt/lampp/bin
这样的地方是否没有第二个 Perl?