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