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を使うことはない。