2011-03-02 16 views
3

私のルーチンを変更し、最終的な出力ファイルをgzipする必要があります。私はperlサブルーチン内で呼び出される処理されたファイルをgzipする最良の方法は何かを理解しようとしています。perl - gzippedファイルを作成するための最良の方法

たとえば、ファイル(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をしますか?そうする最善の方法は何ですか? 私の新しいファイルは​​

ありがとうございます。

答えて

10

私は外部プログラムを使用せずにこれを行うためのモジュールがあります知っているが、私はこれらのモジュールを使用する方法を理解よりもかなり良く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; 
+1

私のケースでは –

+0

よりずっと簡単には得られませんが、 '@ some_uncompressed_data'とは何でしょうか?それは 'print $ gzip @ final_file'でしょうか? – jdamae

+0

@jdamae - それはあなたが現在 '$ out_fh'に送信しているものです。あなたが今やっているように、 'print $ gzip_fh ...'を何度も呼び出すことができます。 – mob

2

あなたはIO ::圧縮を使用することができます::コアPerlモジュールの集合であるGzipで、:perldoc

FWIWで

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); 

詳細は、IO::Uncompress::Gunzipは読み込みのためにもあります同様の方法でgzipされたファイルから。

関連する問題