Apr 09, 2011

IO::Uncompress::AnyUncompress でファイルを展開してみる

ぽちたてgzipbzip2zip といった形式に圧縮されたテキストファイルを直接読み込めるようにしたくて Perl でそうした圧縮ファイルを展開する方法を調べてみると、gzip、bzip2、zip、その他をまとめて扱ってくれる IO::Uncompress::AnyUncompress という、そのものズバリな名前の便利そうなモジュールを発見。早速試しに gzip、bzip2、zipファイルを展開するコードを書いてみました。

#!/usr/bin/perl

use strict;
use warnings;
use IO::Uncompress::AnyUncompress qw/$AnyUncompressError/;

my $file = $ARGV[0];
if ($file =~ /.+\.txt$/) {
    open my $fh, '<', $file
        or die "Couldn't open $file for reading: $!\n";
    my $content .= join '', <$fh>;
    close $fh;
    print $content;
}
elsif ($file =~ /.+\.zip$|.+\.gz$|.+\.bz2$/) {
    my $z = IO::Uncompress::AnyUncompress->new($file)
        or die "anyuncompress failed: $AnyUncompressError\n";
    my $content .= join '', <$z>;
    close $z;
    print $content;
}
else {
    die "Illegal file name: $file\n";
}

exit;

ファイルを引き数に取って、そのファイルがテキストファイルの場合はそのままで、対応している圧縮ファイルの場合は展開してから、文字列の入った $contentprint標準出力へ流しています。改めてテキストファイルが必要なら > で新しいファイルへリダイレクトしてあげるといいかも?

ファイル判別にファイル名の拡張子を使ってるので、中身が何だか分からないアヤシゲなファイルには危なくて使えないけど、ぽちたての用途なら充分使えそうです。

Posted at 15:58 in perl | Comments/Trackbacks ()
Comments/Trackbacks
TrackBack ping me at
http://pochi.usamimi.info/blog/perl/anyuncompress.
Post a comment

writeback message: