【发布时间】:2014-03-21 09:27:10
【问题描述】:
我是 Perl 语言编程的新手。我从 Cpan 官方网站 (https://metacpan.org/pod/Net::FTP::RetrHandle) 剪切并粘贴了一个简短的示例,该示例在 Zip 文件中列出了成员名称,而无需下载整个内容。请注意,我将第一行从“#!/usr/bin/perl”更改为“#!/root/localperl/bin/perl”,因为我想使用最新的 Perl 版本 5.18.2。
#!/root/localperl/bin/perl
use warnings;
use strict;
use Net::FTP;
use Net::FTP::AutoReconnect;
use Net::FTP::RetrHandle;
use Archive::Zip;
my $ftp = Net::FTP::AutoReconnect->new("ftp.info-zip.com", Debug => $ENV{DEBUG})
or die "connect error\n";
$ftp->login('anonymous','example@example.com')
or die "login error\n";
$ftp->cwd('/pub/infozip/unix/linux')
or die "cwd error\n";
my $fh = Net::FTP::RetrHandle->new($ftp,'unz551x-glibc.zip')
or die "Couldn't get handle to remote file\n";
my $zip = Archive::Zip->new($fh)
or die "Couldn't create Zip object\n";
foreach my $fn ($zip->memberNames())
{
print "unz551-glibc.zip: $fn\n";
}
我 gedit ".bash_profile",并添加以下环境变量以供 Perl 特定版本使用:
PERL_BIN=$HOME/localperl/bin
PERL_LIB=$HOME/localperl/lib/5.18.2
export PATH=$PERL_BIN:$PERL_LIB:$PATH
[root@cspp ~]# echo $PATH
/root/localperl/bin:/root/localperl/lib/5.18.2:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/本地/bin:/usr/bin:/bin:/root/bin:/root/bin
我们可以通过运行以下命令来检查当前的 Perl 版本:
[root@cspp ~]# perl -v
这是为 x86_64-linux 构建的 perl 5,版本 18,subversion 2 (v5.18.2)
版权所有 1987-2013,拉里·沃尔
Perl 只能根据艺术许可或 GNU 通用公共许可证,可在 Perl 5 源工具包中找到。
Perl 的完整文档,包括常见问题列表,应该在 本系统使用“man perl”或“perldoc perl”。如果您有权访问 互联网,将您的浏览器指向 http://www.perl.org/,Perl 主页。
当我执行上述代码sn-ps时,它会抛出以下错误:
[root@cspp ~]# perl zipdown.pl
IO 错误:读取失败:在 /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm 第 705 行。 Archive::Zip::Archive::_findEndOfCentralDirectory('Archive::Zip::Archive=HASH(0x1d55618)', 'Net::FTP::RetrHandle=HASH(0x1d55528)') 调用于 /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm 第 607 行 Archive::Zip::Archive::readFromFileHandle('Archive::Zip::Archive=HASH(0x1d55618)', 'Net::FTP::RetrHandle=HASH(0x1d55528)', 'Net::FTP::RetrHandle=HASH(0x1d55528)') 调用于 /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm 第 574 行 Archive::Zip::Archive::read('Archive::Zip::Archive=HASH(0x1d55618)', 'Net::FTP::RetrHandle=HASH(0x1d55528)') 调用于 /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm 第 59 行 Archive::Zip::Archive::new('Archive::Zip::Archive', 'Net::FTP::RetrHandle=HASH(0x1d55528)') 调用于 /root/localperl/lib/5.18.2/Archive/Zip.pm 第 284 行 存档::Zip::new('存档::Zip', 'Net::FTP::RetrHandle=HASH(0x1d55528)') 在 zipdown.pl 第 19 行调用 无法创建 Zip 对象
第19行出现“Couldn't create Zip object”的错误。我认为这种错误不应该是简单的官方源代码本身造成的。所以我提供了一些相关的路径和文件供大家参考:
/root/localperl/lib/5.18.2/Archive/(Extract.pm, Tar.pm, Zip.pm) /root/localperl/lib/5.18.2/Archive/Tar/(Constant.pm, File.pm) /root/localperl/lib/5.18.2/Archive/Zip/(Archive.pm, BufferedFileHandle.pm, DirectoryMember.pm, FAQ.pod, FileMember.pm, Member.pm、MemberRead.pm、MockFileHandle.pm、NewFileMember.pm、 StringMember.pm, Tree.pm, ZipFileMember.pm)
/root/localperl/lib/5.18.2/Net/(Cmd.pm, Config.pm, Domain.pm, FTP.pm, hostent.pm、libnetFAQ.pod、netent.pm、Netrc.pm、NNTP.pm、Ping.pm、 POP3.pm、protoent.pm、servent.pm、SMTP.pm、Time.pm) /root/localperl/lib/5.18.2/Net/FTP/(A.pm, AutoReconnect.pm, dataconn.pm, E.pm, I.pm, L.pm, RetrHandle.pm)
值得一提的是,Perl 安装程序默认无法安装 Zip 模块。因此,我使用“cpan”环境独立安装如下:
root# cpan
cpan> install Archive::Zip
cpan> quit
root#
另外,为了使用 Net::FTP::AutoReconnect 和 Net::FTP::RetrHandle 模块,我下载了 perl-Net-FTP-AutoReconnect-0.3-3.el6.noarch.rpm 和 perl-Net -FTP-RetrHandle-0.2-3.el6.noarch.rpm 分别从http://pkgs.org/centos-6/epel-i386/perl-Net-FTP-AutoReconnect-0.3-3.el6.noarch.rpm.html和http://pkgs.org/centos-6/epel-i386/perl-Net-FTP-RetrHandle-0.2-3.el6.noarch.rpm.html链接,一一安装:
rpm -ivh perl-Net-FTP-AutoReconnect-0.3-3.el6.noarch.rpm
rpm -ivh perl-Net-FTP-RetrHandle-0.2-3.el6.noarch.rpm
据我所知,我花了一整天的时间尝试所有可能的解决方案。我现在无事可做,只能向来自 SO 的 Perl 专家寻求帮助。非常感谢您!
【问题讨论】:
-
文件是否存在?您可以使用常规 FTP 客户端下载该文件吗?
-
@Colin Pickard:感谢您关注我的问题。是的。 ftp.info-zip.com/pub/infozip/unix/linux/unz551x-glibc.zip 肯定是 FTP 主机。