perl - 创建gzip压缩文件的最佳方法

时间:2011-03-02 21:08:32

标签: perl

我需要改变我的例程并让最终的outfile被gzip压缩。我试图弄清楚在perl子例程中调用已处理文件的最佳方法是什么。

例如,我有一个创建文件的子例程(extract_data)。 这是主循环和子程序:

foreach my $tblist (@tblist)
{
   chomp $tblist;
   extract_data($dbh, $tblist);
};
$dbh->disconnect;

sub extract_data
{
     my($dbh, $tblist) = @_;
     my $final_file = "/home/proc/$node-$tblist.dat";
     open (my $out_fh, '>', $final_file) or die "cannot create $final_file: $!";
     my $sth = $dbh->prepare("...");
     $sth->execute();
     while (my($uid, $hostnm,$col1,$col2,$col3,$upd,$col5) = $sth->fetchrow_array() ) {
       print $out_fh "__my_key__^A$uid^Ehost^A$hostnm^Ecol1^A$col1^Ecol2^A$col2^Ecol3^A$col3^Ecol4^A$upd^Ecol5^A$col5^D";
     }
     $sth->finish;
     close $out_fh or die "Failed to close file: $!";
};

我是在主要内部还是使用子内容进行gzip?这样做的最佳方法是什么? 然后我的新文件将是$final_file =/home/proc/$node-$tblist.dat.gz

感谢。

2 个答案:

答案 0 :(得分:10)

我知道有些模块可以在不使用外部程序的情况下执行此操作,但由于我了解如何使用gzip比了解如何使用这些模块要好得多,所以我只需打开一个进程{{1}并称它为一天。

gzip

答案 1 :(得分:2)

您可以使用IO :: Compress :: Gzip,它位于核心Perl模块集中:

use IO::Compress::Gzip qw(gzip $GzipError) ;

my $z = new IO::Compress::Gzip($fileName);
  or die "gzip failed: $GzipError\n";

# object interface
$z->print($string);
$z->printf($format, $string);
$z->write($string);
$z->close();

# IO::File mode
print($z $string);
printf($z $format, $string);
close($z);

perldoc

的更多详情

FWIW,还有IO::Uncompress::Gunzip以类似方式从gzip压缩文件中读取。