gpt4 book ai didi

linux - Archive::Zip 无法在 Perl 中创建 Zip 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:28 26 4
gpt4 key购买 nike

我是 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 通用公共(public)许可证,可以在 Perl 5 源代码包中找到。

Perl 的完整文档,包括 FAQ 列表,可以在该系统使用“man perl”或“perldoc perl”。如果您有权访问互联网,将您的浏览器指向http://www.perl.org/ , Perl 主页。

当我执行上述代码片段时,它抛出以下错误:

[root@cspp ~]# perl zipdown.pl

IO error: read failed : at /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm line 705. Archive::Zip::Archive::_findEndOfCentralDirectory('Archive::Zip::Archive=HASH(0x1d55618)', 'Net::FTP::RetrHandle=HASH(0x1d55528)') called at /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm line 607 Archive::Zip::Archive::readFromFileHandle('Archive::Zip::Archive=HASH(0x1d55618)', 'Net::FTP::RetrHandle=HASH(0x1d55528)', 'Net::FTP::RetrHandle=HASH(0x1d55528)') called at /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm line 574 Archive::Zip::Archive::read('Archive::Zip::Archive=HASH(0x1d55618)', 'Net::FTP::RetrHandle=HASH(0x1d55528)') called at /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm line 59 Archive::Zip::Archive::new('Archive::Zip::Archive', 'Net::FTP::RetrHandle=HASH(0x1d55528)') called at /root/localperl/lib/5.18.2/Archive/Zip.pm line 284 Archive::Zip::new('Archive::Zip', 'Net::FTP::RetrHandle=HASH(0x1d55528)') called at zipdown.pl line 19 Couldn't create Zip object

错误“Couldn't create Zip object”出现在第19行。我认为这种错误不应该是由简单的官方源代码本身引起的。所以我提供了一些相关的路径和文件供大家引用:

/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.htmlhttp://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 专家寻求帮助。非常感谢您!

最佳答案

首先,在弄清楚如何设置 perl + 库的本地副本方面做得很好。然而最好不要用 perl 来学习。

其次,虽然 CPAN 是“官方的”,但您在其上找到的软件包是由很多人编写的,而且代码质量参差不齐。 Net::FTP::RetrHandle 的版本为 0.2,日期为 2006 年。这并不意味着它是糟糕的代码,只是它没有被广泛使用。

我试过这个例子,但它和你一样失败了。

然后我在末尾注释掉了Archive::Zip 代码,只使用文件句柄从FTP 服务器读取数据并将其保存到文件中。该文件似乎是一个有效的 ZIP 存档,因此我们知道基本情况很好。

然后我尝试给 Archive::Zip 代码一个普通的文件句柄来处理。那很好。

所以 - 这是两者之间的某种相互作用。查看 Archive::Zip 源代码,在从文件末尾向后搜索后尝试读取时发生错误。所以 - 我查看了 Net::FTP::RetrHandle 模块中的搜索子例程。我注意到您可以设置一个调试环境变量,我也这样做了。

export DEBUG=1
perl ftp_fh_test.pl
...
Net::FTP=GLOB(0x2e99ce8)<<< 250 Connected to /dsa0/infozip/pub/infozip/unix/linux.
Net::FTP=GLOB(0x2e99ce8)>>> PORT 192,168,1,43,226,125
Net::FTP=GLOB(0x2e99ce8)<<< 200 Port 226.125 at Host 80.229.41.160 accepted.
Net::FTP=GLOB(0x2e99ce8)>>> REST 155293
Net::FTP=GLOB(0x2e99ce8)<<< 500 I never heard of the REST command. Try HELP.
IO error: read failed...

因此 - FTP 服务器无法识别“REST”命令,因此您无法通过该服务器进行搜索。尝试不同的 FTP 服务器。

您可能还喜欢perlbrewlocal::lib作为开发设置的一部分。对于设置本地 perl 环境非常有用。

关于linux - Archive::Zip 无法在 Perl 中创建 Zip 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21907769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com