2011-03-02 66 views
3

我需要改變我的例程,並將最終的outfile解壓縮。我試圖弄清楚在perl子例程中調用一個處理文件的最佳方法是什麼。perl - 創建gzip文件的最佳方式

例如,我有一個創建文件(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

在我的情況下,它並沒有比 – 2011-03-02 21:18:22

+0

更容易,那麼'@ some_uncompressed_data'是什麼?會打印$ gzip @ final_file嗎? – jdamae 2011-03-02 21:35:41

+0

@jdamae - 無論你現在發送給'$ out_fh'。如果你願意的話,你可以多次調用'print $ gzip_fh ...'',就像你現在正在做的那樣。 – mob 2011-03-02 21:40:20

2

您可以使用IO ::壓縮:: Gzip已,這是在一套核心Perl模塊:在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文件以類似的方式。

相關問題