http://www.perlmonks.org?node_id=995878

cmv has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks!

I'm seeing some unusual IO::Uncompress::Gunzip behavior, that doesn't seem to track with how the gzip command works. Please help me understand this difference. Basically, if I have a number of gzipped files in a directory, and run the command

cat files* | gunzip -c
I get the contents of all the files to stdout. However, if I do a similar thing from inside a perl script, using IO::Uncompress::Gunzip, I only get the contents of the first file. Here is my test script (for unix):
use strict; use warnings; use IO::Compress::Gzip qw(gzip $GzipError) ; use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ; my $file; for my $txt ( qw(File1| File2| File3|) ) { $file = "/tmp/tst${txt}.gz"; print STDERR "$file\n"; gzip \$txt => $file or die "gzip failed: $GunzipError\n"; } my $contents = `cat /tmp/tst*`; print STDERR "contents=$contents\n"; my $out; gunzip \$contents => \$out or die "gunzip failed: $GunzipError\n"; print STDERR "Here comes the decrypted stuff:\n$out\n"; print STDERR "Now we use the gunzip command to do the same:\n"; print STDERR `cat /tmp/tst* | gunzip -c`;
Any pointers are greatly appreciated!

Thanks

-Craig

Replies are listed 'Best First'.
Re: Unusual IO::Uncompress::Gunzip behavior
by pmqs (Friar) on Sep 27, 2012 at 09:15 UTC
    You need to use the MultiStream option if you want to deal with concatenated gzip files.

    use strict; use warnings; use IO::Compress::Gzip qw(gzip $GzipError) ; use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ; my $gzipped; for my $txt ( qw(Alpha Beta Gamma)) { gzip \$txt => \$gzipped, Append => 1 or die "gzip failed: $GzipError\n"; } my $out; gunzip \$gzipped => \$out, MultiStream => 1 or die "gunzip failed: $GunzipError\n"; print "Uncompressed is:\n$out\n";

      pmqs++

      Many thanks for pointing this out!

      Danged if I can figure out how I missed that after going through the docs so many times.

      Maybe it's time for reading glasses...

      -Craig

      Update: This test program will hang on *nix machines that have IO::Compress 2.015. I've found that you need at least 2.020, and have upgraded my systems to 2.055