Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

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
[Tanktalus]: Sure, no one is active for hours and hours in the cb, so I go to upgrade the db, and then someone is active. Sheesh :)
[Discipulus]: anyway poppins probably died with the last night cold. But is not normal to see them in dec. they must pop in April
NodeReaper eyes the thorns in the side
Discipulus : the party puller!
[Discipulus]: I was trying to solve this but i'm not. my regex-fu is stuck at primary school

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2017-12-18 21:37 GMT
Find Nodes?
    Voting Booth?
    What programming language do you hate the most?

    Results (499 votes). Check out past polls.