Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Unusual IO::Uncompress::Gunzip behavior

by cmv (Chaplain)
on Sep 26, 2012 at 21:22 UTC ( #995878=perlquestion: print w/replies, xml ) Need Help??
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!



Replies are listed 'Best First'.
Re: Unusual IO::Uncompress::Gunzip behavior
by pmqs (Pilgrim) 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";


      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...


      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

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://995878]
Approved by Kenosis
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (5)
As of 2017-11-24 20:58 GMT
Find Nodes?
    Voting Booth?
    In order to be able to say "I know Perl", you must have:

    Results (353 votes). Check out past polls.