以下脚本创建一个名为“ input.gz”的gzip文件。然后,脚本尝试使用打开“ input.gz” gzip -dc。凭直觉,die如果提供了错误的输入文件名,则应触发。但是,就像下面的脚本一样,die即使提供了错误的输入文件名(“ inputx.gz”),该程序也不会:
use warnings;
use strict;
system("echo PASS | gzip -c > input.gz");
open(IN,"-|","gzip -dc inputx.gz") || die "can't open input.gz!";
print STDOUT "die statment was not triggered!\n";
close IN;
Run Code Online (Sandbox Code Playgroud)
上面脚本的输出是
die statment was not triggered!
gzip: inputx.gz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么die即使由于gzip错误退出也没有触发语句?die当给出错误的文件名时,如何使语句触发?
它埋在perlipc中,但这似乎很相关(添加了重点):
小心检查open()和close()的返回值。如果要写入管道,则还应捕获SIGPIPE。否则,请想一想,当您启动一条不存在的命令的管道时会发生什么:open()很有可能会成功(它仅反映fork()的成功),但随后您的输出将失败- -壮观地 Perl无法知道该命令是否有效,因为您的命令实际上是在一个单独的进程中运行的,该进程的exec()可能会失败。因此,尽管伪指令的阅读器仅返回快速的EOF,但伪指令的编写者将受到信号的打击,他们最好准备好处理该信号。
使用IO::Uncompress::Gunzip,而不是阅读gzip压缩文件。