收集总结怎么用perl打开/处理.gz  zip  tar.gz压缩文件?

收集总结怎么用perl打开/处理.gz  zip  tar.gz压缩文件?
最近想使用perl 对文件进行压缩,但是百度了好久,方法N多,但是都只言片语。这里总结几个自己搜索到的结果。
主要有两种方法:
1、调用系统的解压缩命令

在linux 下调用tar 命令的举例如下:
tar_name = "tar_example".".tar.gz";
$cmd = "tar -cvfz $tar_name test1.pl test2.pl";
system($cmd);
或者
tar xvfz $_` for @ARGV;
使用PERL直接读取压缩文件 use pipe
.gz格式文件
open(FIN,"gzip -dc $infilename|") or die ("can not open $infilename\n");
.tgz(.tar.gz)格式文件
open(FIN,"tar -xf $infilename -o|") or die ("can not open $infilename\n");
7zip格式文件
open(FIN,"7za e -so $infilename|") or die ("can not open $infilename\n");
2、使用perl 提供的解压缩模块
但是由于操作系统OS各异,实现起来还是有区别的。由于不同操作系统支持以及安装的模块包不同,所以需要区别对待。
目前知道的模块有Archive::Tar、Compress::Zlib、Archive::Zip、IO::Compress::Gzip、PerlIO::gzip
关于各模块的使用帮助可以参与好似有命令perldoc <模块名> 进行查询
如果为了可移植性,可以用Archive::Tar处理tgz文件,用IO::Zlib处理gz文件。
由于Archive::Tar需要把整个包读入内存,资源消耗大且很慢,只能用于较小的tgz文件。

目前我的程序是在windows下面运行的。
最后我的做法是,
(1)用Archive::Tar处理.tar, .tar.gz, .tgz文件。
(2)用Compress::Zlib处理.gz文件。
(3)用Archive::Zip处理.zip文件.

linux 下使用
IO::Compress::Gzip,但是这个模块有个小问题 它不能把多个文件同时压缩在一个文件里面 并且压缩前和压缩后的文件名得相同。

Archive::Tar; 的使用例子:
#!/usr/bin/perl
use Archive::Tar;

my @files = <*>;
my $target = 'my.tgz';
my $tar = Archive::Tar->new();
$tar->add_files(@files);
$tar->write($target, COMPRESS_GZIP);

Archive::Zip的使用例子:
#!/usr/bin/perl

use strict;
use warnings;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
my $zip = Archive::Zip->new();
$zip->addFile("/home/admin/simple.pl","simples.pl");
$zip->addTree("/home/admin","admins");

unless ( $zip->writeToFileNamed('/usr/zip.zip') == AZ_OK )
{   
        print "失败!\n";
}
else
{   
        print "成功!\n";
}

权限不够的话,可以安装到自己家目录下,比如使用Local::lib 安装
用PerlIO包的用法举例:
1)在*.pl前加上
 use lib "/libPath";
 use PerlIO::gzip;

2)在用的时候:

open FI, "<:gzip", "$fi";
open FO, ">:gzip", "$fo";
3. 用 File::Package;

 #!/usr/bin/perl -w
use strict;
use File::Package;
 
my $uut='Tie::Gzip';
my $fp='File::Package';
$fp->load_package($uut);
 
tie *GZIP,'Tie::Gzip';
my $gzip=\*GZIP;
open($gzip,"> test.gz");
 
while(my $line=<$gzip>){
chomp $line;
print"$line\n";
}
close $gzip;
 
tie *OUT,'Tie::Gzip';
my $out=\*OUT;
open($out,"> test.gz");
print $out "I want to know more!\n"
close $out;

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年11月    »
123
45678910
11121314151617
18192021222324
252627282930
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2