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 cruzadaSimplesDesvantagens
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 :: ExecutarNão há interface para gravar em um identificador de arquivo em IPC :: Run, anexando apenas a um escalar. Isso parece ... estranho.
IPC :: Run3Nenhuma 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?
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?