I have the following code segment in a much larger script:
if ($myfile =~ /\.gz$/) { open(MYFILE, "/bin/zcat $myfile |") || die("ERROR: Cannot open $my +file for read: $!\n"); } else { open(MYFILE, "$myfile") || die("ERROR: Cannot open $myfile for rea +d: $!\n"); } my $myfile_timestamp = (stat(MYFILE))[9]; close(MYFILE);
When I run the script that contains the above, I receive the following error at the "close(MYFILE)" line:
gzip: stdout: Broken pipe
But the script runs to completion without any other apparent issues.
If I just copy/paste the above code into a standalone script and hardcode the path to $myfile, the error doesn't occur.
If I add "use autodie;" to the top of the script, the script exits at the "close(MYFILE)" line with the following messages:
gzip: stdout: Broken pipe Can't close filehandle 'MYFILE': '' at myscript.pl line 1014
If I add the following code either before or after the timestamp assignment, the error doesn't occur:
while (<MYFILE>) { chomp($_); }
If I don't close the filehandle, the error doesn't occur and it doesn't seem to cause any other problems in the script.
If I change the assignment to $myfile_timestamp to a constant as opposed to reading an attribute from the filehandle, the error is the same.
Does anyone know what could be causing the broken pipe error? Is there any way I can debug it further? Reading from the pipe seems to provide a workaround but I'm not sure why it's necessary. This same code structure (doing either a standard open/read for a non-gzipped file or a zcat pipe open for a gzipped file) is used elsewhere in the script and doesn't ever give a "broken pipe" error.
In reply to zcat pipe gives "gzip: stdout: Broken pipe" error by Special_K
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |