use FileHandle; sub pipe_from_fork ($) { my $parent = shift; pipe $parent, my $child or die; my $pid = fork(); die "fork() failed: $!" unless defined $pid; if ($pid) { close $child; } else { close $parent; open(STDOUT, ">&=" . fileno($child)) or die; } $pid; } sub decompress_filehandle { my $fh = shift; my $dfh = new FileHandle; # Must use pipe_from_fork because $dfh->open('-|') not yet implemented on # Windows. See perlfork for details unless (pipe_from_fork($dfh)) { # In child close $dfh; open(FRONT_OF_PIPE, '| c:\progra~1\cygwin\bin\gzip.exe -cd') or return (undef,"Can't execute \"$filter_command\" on file handle: $!"); print FRONT_OF_PIPE <$fh>; $fh->close() or return (undef,"Can't execute \"$filter_command\" on file handle: $!"); close FRONT_OF_PIPE; exit; } # In parent close $fh; return $dfh; } my $fh = new FileHandle('mailarc-1.txt.gz'); my $dfh = decompress_filehandle($fh); print $_ while <$dfh>;