Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

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!

Thanks

-Craig

Comment on Unusual IO::Uncompress::Gunzip behavior
Select or Download Code
Replies are listed 'Best First'.
Re: Unusual IO::Uncompress::Gunzip behavior
by pmqs (Monk) 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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://995878]
Approved by Kenosis
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (18)
As of 2015-07-29 14:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (263 votes), past polls