perl—创建gzip文件的最佳方法
我需要改变我的常规,并有最后的输出文件被压缩。我试图找出在perl子例程中gzip处理过的文件的最佳方法 例如,我有一个子例程创建文件(提取数据)。 以下是主循环和子例程:perl—创建gzip文件的最佳方法,perl,Perl,我需要改变我的常规,并有最后的输出文件被压缩。我试图找出在perl子例程中gzip处理过的文件的最佳方法 例如,我有一个子例程创建文件(提取数据)。 以下是主循环和子例程: foreach my $tblist (@tblist) { chomp $tblist; extract_data($dbh, $tblist); }; $dbh->disconnect; sub extract_data { my($dbh, $tblist) = @_; my $
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\u file=/home/proc/$node-$tblist.dat.gz
谢谢 我知道有一些模块可以在不使用外部程序的情况下实现这一点,但由于我对如何使用
gzip
的理解要比我对如何使用这些模块的理解要好得多,所以我只需打开一个进程来gzip
,到此为止
open (my $gzip_fh, "| /bin/gzip -c > $final_file.gz") or die "error starting gzip $!";
...
while (... = $sth->fetchrow_array()) {
print $gzip_fh "__my_key__^A$uid^Ehost^A$hostname..."; # uncompressed data
}
...
close $gzip_fh;
您可以使用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);
详情请浏览
FWIW,还有一个类似的方法来读取gzip文件。没有比这更容易的了。在我的情况下,
@一些未压缩的数据
?是不是print$gzip@final_file
?@jdamae-这是您当前发送到$out_fh
的内容。如果您愿意,您可以多次调用print$gzip\u fh…
,就像您现在所做的那样。@Nathan Fellman:是的,它确实变得更容易…使用PerlIO::gzip;打开(my$gzip_fh,'>:gzip',“$final_file.gz”)
@mob如何指定以这种方式传输到gzip的内容的编码。在open
语句中放置类似:encoding(utf8)
之类的内容有点困惑?