如果文件不存在,为什么我的Perl管道没有zcat死?

时间:2010-10-25 12:17:40

标签: perl pipe zcat

如果我的gz文件不存在,为什么不DIE?

$ cat test.pl    
open(FILE, "zcat dummy.gz |") or die "DIE";

$ ./test.pl    
zcat: dummy.gz: No such file or directory

如果我正常读取文件,它会按预期工作:

$ cat test2.pl    
open(FILE, "dummy.gz") or die "DIE";

$ ./test2.pl    
DIE at ./test.pl line 2.

3 个答案:

答案 0 :(得分:5)

您的open成功(因为它成功运行zcat),在关闭文件描述符之前,您将不会获得zcat的退出代码。

您可能想要在开始之前检查文件是否存在且可读,例如

die "unable to read file" unless (-f "dummy.gz" and -r "dummy.gz")

答案 1 :(得分:3)

您可能需要考虑使用PerlIO::gzip,例如

use PerlIO::gzip;
open(FILE, '<:gzip', 'dummy.gz') or die $!;

答案 2 :(得分:3)

在第二个示例中,由perl 打开的文件不存在,因此它将会死亡。

在你的第一个例子中,perl 调用的命令执行(带有任何结果),所以没有理由死。