Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl—创建gzip文件的最佳方法_Perl - Fatal编程技术网

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 $

我需要改变我的常规,并有最后的输出文件被压缩。我试图找出在perl子例程中gzip处理过的文件的最佳方法

例如,我有一个子例程创建文件(提取数据)。 以下是主循环和子例程:

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)
之类的内容有点困惑?