PerlでZip

ZIPの圧縮・解凍のサンプルとして、102808008463301583196.zipを読み込んで102808008463301583196.2.zipを作るコードを書く。

Archive::Zipは標準モジュールとしてインストールされているので導入のハードルは低い。が、目的としてはZipファイル自体をどうこうしたいわけじゃなく、ログファイルの容量が大きいから圧縮して操作したいというだけなので、ファイルベースのオペレーションは何とも具合が悪い。あと、addString()で文字列を追加するとデフォルトでは圧縮されないらしいので注意。

IO::Compress::Zip/IO::Uncompress::UnzipはストリームをZip化するモジュールで、まさしくやりたかったことができる。が、いちいちインストールするの面倒くさい・・・。まあ、一度インストールしてしまえばいいんだけど、別環境にportするときのことを考えると面倒だなあと。

1. Archive::Zip

use strict;
use warnings;
use Archive::Zip qw/:CONSTANTS :ERROR_CODES/;

my $file = '102808008463301583196';
my $zip = Archive::Zip->new("$file" . ".zip");
my $contents = $zip->contents($file);

my $zip2 = Archive::Zip->new;
$zip2->addString($contents, $file)->desiredCompressionMethod(COMPRESSION_DEFLATED);
$zip2->writeToFileNamed("$file" . ".2.zip");
$ unzip -v 102808008463301583196.zip
Archive:  102808008463301583196.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
  361465  Defl:N    48774  87% 2013/09/25 14:20 5b1b4fb9  102808008463301583196
--------          -------  ---                            -------
  361465            48774  87%                            1 file

$ unzip -v 102808008463301583196.2.zip
Archive:  102808008463301583196.2.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
  361465  Defl:N    48657  87% 2013/09/25 15:55 5b1b4fb9
--------          -------  ---                            -------
  361465            48657  87%                            1 file

2. IO::Compress::Zip/IO::Uncompress::Unzip

use strict;
use warnings;
use IO::Compress::Zip qw/$ZipError/;
use IO::Uncompress::Unzip qw/$UnzipError/;

my $file = '102808008463301583196';
my $ifh = new IO::Uncompress::Unzip "$file" . ".zip" or die $UnzipError;
my $content = do { local $/; <$ifh> };
close $ifh;

my $ofh = new IO::Compress::Zip "$file" . ".2.zip" or die $ZipError;
print $ofh $content;
close $ofh;
$ unzip -v 102808008463301583196.2.zip
Archive:  102808008463301583196.2.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
  361465  Defl:N    48657  87% 2013/09/25 15:57 5b1b4fb9  102808008463301583196
--------          -------  ---                            -------
  361465            48657  87%                            1 file

追記

IO::Compress::Gzipは標準で入ってるぽいので、こっちを使えばいいのか。わざわざZipを使うことはない。