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

时间:2014-02-20 12:26:01

标签: linux perl ftp

我是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中:/根/ bin中:/根/ bin中

我们可以通过运行以下命令来检查活动的Perl版本:

[root@cspp ~]# perl -v

这是为x86_64-linux构建的perl 5,版本18,subversion 2(v5.18.2)

版权所有1987-2013,Larry Wall

Perl只能根据艺术许可或条款的条款进行复制 GNU通用公共许可证,可以在Perl 5源代码包中找到。

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

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

[root@cspp ~]# perl zipdown.pl
  

IO错误:读取失败:at   /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm第705行。     存档::邮编::存档:: _ findEndOfCentralDirectory( '归档::邮编::存档= HASH(0x1d55618)',   调用的是'Net :: FTP :: RetrHandle = HASH(0x1d55528)'   /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm第607行     存档::拉链::存档:: readFromFileHandle( '归档::邮编::存档= HASH(0x1d55618)',   '净:: FTP :: RetrHandle = HASH(0x1d55528)',   调用的是'Net :: FTP :: RetrHandle = HASH(0x1d55528)'   /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm第574行     存档:: ZIP ::存档::读( '存档::邮编::存档= HASH(0x1d55618)',   调用的是'Net :: FTP :: RetrHandle = HASH(0x1d55528)'   /root/localperl/lib/5.18.2/Archive/Zip/Archive.pm第59行     存档::邮编::档案::新(“存档::邮编::存档”,   调用的是'Net :: FTP :: RetrHandle = HASH(0x1d55528)'   /root/localperl/lib/5.18.2/Archive/Zip.pm第284行     存档::邮编::新(“存档::邮编”,   在zipdown.pl第19行调用'Net :: FTP :: RetrHandle = HASH(0x1d55528)')   无法创建Zip对象

错误,显示“无法创建Zip对象”,发生在第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

我花了一整天的时间来尝试所有可能的解决方案,因为我的知识可以达到。我现在无所事事,只能转向你的Perl大师们从SO寻求帮助。非常感谢你提前!

2 个答案:

答案 0 :(得分:1)

首先,在确定如何设置perl +库的本地副本方面做得很好。但是最好不要用perl来学习。

其次,尽管CPAN是“官方”的,但您在其上找到的软件包是由各种各样的人编写的,代码质量各异。 Net :: FTP :: RetrHandle的版本是0.2,可以追溯到2006年。这并不意味着它的代码很糟糕,只是它没有被大量使用。

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

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

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

所以 - 这是两者之间的一些互动。查看Archive :: Zip源代码,当它从文件末尾向后搜索时尝试读取时发生错误。所以 - 我看了一下Net :: FTP :: RetrHandle模块中的seek子程序。我注意到你可以设置一个调试环境变量,我做了。

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环境非常有用。

答案 1 :(得分:-1)

我怀疑您只下载了Perl本身但未升级Perl模块。

它可能(可能)适用于PuePerl(PP)模块,但适用于使用XS(C代码)的模块。

解决方案是下载模块。

http://www.cpan.org/misc/how-to-mirror.html

最简单:

/usr/bin/rsync -av --delete cpan-rsync.perl.org::CPAN /project/CPAN/

更好:

How can I use CPAN as a non-root user?

wget -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile

此致