【问题标题】:Pipe STDERR using IO::Pipe Perl使用 IO::Pipe Perl 管道 STDERR
【发布时间】:2018-10-29 08:56:40
【问题描述】:
my $writer = IO::Pipe->new();
$writer->writer();
print $writer $some_function();
$writer->flush();
$writer->close;

如果some_function 产生一些异常或 STDERR 会发生什么?是写到$writer的吗?如果否,如何实现?

【问题讨论】:

  • 不,您只是将结果打印到该句柄。 /// 使用eval 捕获异常。捕获将发送到 STDERR 的内容要复杂得多,但我认为 Capture::Tiny 可以提供帮助。 /// 或者,您可以将管道分配给 fd 2,使其成为 STDERR

标签: perl pipe


【解决方案1】:

你需要抓住$SIG{__WARN__}和/或$SIG{__DIE__}

{
    my $writer = IO::Pipe->new();
    $writer->writer();
    local $SIG{__WARN__} = sub { print $writer $_[0] };
    local $SIG{__DIE__} = sub { print $writer $_[0] };
    print $writer $some_function();
    $writer->flush();
    $writer->close;
}

$SIG{__DIE__} 处理程序需要根据您处理严重错误的方式进行修改。

https://perldoc.perl.org/perlvar.html#%25SIG

【讨论】:

  • 请注意,$SIG{__WARN__} 和 $SIG{__DIE__} 仅捕获对这些 perl 函数的调用,而不是直接写入 STDERR 的任何内容。 Capture::Tiny 可用于捕获写入 STDERR 的所有内容,eval or try 可用于捕获异常,比覆盖 $SIG{__DIE__} 更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
相关资源
最近更新 更多