My Perl脚本输出并记录多行文本,并进行一些清理并压缩END
块中的一些日志。
问题是当你在命令行上执行类似的操作时:
perl myscript.pl | head -n 10
这会导致脚本在输出10行后立即死亡,因此END
块不会执行,并且日志不会被压缩。有没有办法绕过这个并确保我的END
块中的代码仍然执行?
答案 0 :(得分:10)
当管道的读取端关闭,并且写入过程尝试将某些内容写入管道时,写入过程将收到SIGPIPE
。管道被称为破碎。
我们可以像
一样捕获此事件local $SIG{PIPE} = sub {
# This is our event handler.
warn "Broken pipe, will exit\n";
exit 1;
};
这将优雅地退出您的程序。您可以提供字符串IGNORE
,而不是将子安装为事件处理程序。这样就可以让你的脚本继续运行,好像什么都没发生一样。
# print will now return false with $!{EPIPE} true instead of dying
local $SIG{PIPE} = 'IGNORE';