Qual é o módulo IPC Perl de plataforma cruzada preferencial?

Eu quero criar um objeto IO simples que representa um pipe aberto para outro programa para que eu possa gravar periodicamente STDIN de outro programa como meu aplicativo é executado. Eu quero que ele seja à prova de balas (na medida em que captura todos os erros) e multiplataforma. As melhores opções que posso encontrar são:

open
<code>sub io_read {
    local $SIG{__WARN__} = sub { }; # Silence warning.
    open my $pipe, '|-', @_ or die "Cannot exec $_[0]: $!\n";
    return $pipe;
}
</code>

Vantagens:

Plataforma cruzadaSimples

Desvantagens

Não$SIG{PIPE} para capturar erros do programa canalizadoOutros erros são detectados?IO :: Pipe
<code>sub io_read {
    IO::Pipe->reader(@_);
}
</code>

Vantagens:

SimplesRetorna um objeto IO :: Handle para interface OOSuportado pelo núcleo Perl.

Desvantagens

Ainda não$SIG{PIPE} para capturar erros do programa canalizadoNão suportado no Win32 (ou, pelo menos,seus testes são ignorados)IPC :: Executar

Não há interface para gravar em um identificador de arquivo em IPC :: Run, anexando apenas a um escalar. Isso parece ... estranho.

IPC :: Run3

Nenhuma interface de manipulação de arquivos aqui também. Eu poderia usar um código de referência, que seria chamado repetidamente para spool para o filho, mas olhando para o código-fonte, parece que ele realmente grava em um arquivo temporário e, em seguida, abre e spoolsEstá conteúdo para o comando pipe'dSTDIN. Wha?

IPC :: Cmd

Ainda não há interface de manipulação de arquivos.

O que estou perdendo aqui? Parece que isso deveria ser um problema resolvido, e estou meio surpreso que não seja. IO :: Pipe chega mais perto do que eu quero, mas a falta de$SIG{PIPE} O tratamento de erros e a falta de suporte para o Windows são penosos. Onde está o módulo de tubulação que será o JDWIM?

questionAnswers(2)

yourAnswerToTheQuestion