3

我的 Perl 脚本输出并记录多行文本,它会进行一些清理并将一些日志压缩成一个END块。

问题是当您在命令行上执行以下操作时:

perl myscript.pl | head -n 10

这会导致脚本在输出 10 行后立即终止,因此该END块不会被执行并且日志不会被压缩。有没有办法解决这个问题并确保我的END块中的代码仍然执行?

4

1 回答 1

10

当管道的读取端关闭,并且写入进程尝试向管道写入内容时,写入进程会收到一个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';
于 2013-07-23T16:33:32.897 回答