Какой предпочитаемый кроссплатформенный модуль IPC Perl?
Я хочу создать простой объект ввода-вывода, который представляет канал, открытый для другой программы, который я могу периодически записывать в STDIN другой программы во время работы моего приложения. Я хочу, чтобы он был пуленепробиваемым (в том смысле, что он ловит все ошибки) и кроссплатформенным. Лучшие варианты, которые я могу найти:
open
<code>sub io_read { local $SIG{__WARN__} = sub { }; # Silence warning. open my $pipe, '|-', @_ or die "Cannot exec $_[0]: $!\n"; return $pipe; } </code>
Преимущества:
Cross-platform SimpleНедостатки
No$SIG{PIPE}
to catch errors from the piped program
Are other errors caught?
IO::Pipe
<code>sub io_read { IO::Pipe->reader(@_); } </code>
Преимущества:
Simple Returns an IO::Handle object for OO interface Supported by the Perl core.Недостатки
Still No$SIG{PIPE}
to catch errors from the piped program
Not supported on Win32 (or, at least, its tests are skipped)
IPC::Run
В IPC :: Run нет интерфейса для записи в дескриптор файла, только добавление в скаляр. Это кажется странным.
IPC::Run3Здесь нет интерфейса дескриптора файла. Я мог бы использовать ссылку на код, которая будет вызываться повторно для спулинга дочернему элементу, но, глядя на исходный код, кажется, что он фактически записывает во временный файл, а затем открывает его и спулингируетits содержимое в трубу 'd команды'STDIN
, Wha?
Все еще нет интерфейса дескриптора файла.
Что мне здесь не хватает? Кажется, что это должно быть решенной проблемой, и я немного ошеломлен, что это не так. IO :: Труба ближе всего подходит к тому, что я хочу, но отсутствие$SIG{PIPE}
Обработка ошибок и отсутствие поддержки Windows беспокоит. Где находится модуль трубопровода, который будет JDWIM?