我是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.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
我花了一整天的时间来尝试所有可能的解决方案,因为我的知识可以达到。我现在无所事事,只能转向你的Perl大师们从SO寻求帮助。非常感谢你提前!
答案 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服务器。
您可能还需要perlbrew和local::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
此致