В Perl мне часто нужно запускать дочерний процесс, посылать ему входные данные, а затем читать их выходные данные.Для этого есть ряд модулей, но все они, похоже, требуют, чтобы вы передавали уже существующие переменные, которые затем модифицируются функцией, чтобы они содержали файловые дескрипторы.Вот пример из Синопсиса IPC :: Open3 :
my ($wtr, $rdr, $err);
use Symbol 'gensym'; $err = gensym;
$pid = open3($wtr, $rdr, $err,
'some cmd and args', 'optarg', ...);
Этот шаблон становится немного раздражающим, когда мне приходится делать это снова и снова, особенно потому, что он включает кучупозиционных параметров, которые мне нужно либо запомнить, либо посмотреть.Есть ли какой-нибудь модуль, который предоставляет функцию (назовем ее myopen3
), которая работает следующим образом?
my ($wtr, $rdr, $err) = myopen3('some cmd and args', 'optarg', ...);
Или он может вернуть хэш или хэш-ссылку соответствующих дескрипторов:
my $process = myopen3('some cmd and args', 'optarg', ...);
$process->{STDIN}->print("Some input");
my $output = $process->{STDOUT}->readline;
Преимущества такой функции в том, что myopen3
называется точно так же, как встроенный system
(хотя, мы надеемся, без каких-либо причуд), и в случае возвратаhash или hashref, позиционные параметры и возвращаемые значения исключаются.(Кроме того, если автор модуля позже решил также вернуть pid и другую информацию о процессе, что можно было бы сделать при сохранении обратной совместимости.)
Я фактически реализовал это сам (с простым интерфейсом OO), но я бы предпочел не полагаться на свой собственный пользовательский модуль, если существует модуль CPAN для того же.
Самое близкое, что я нашел на данный момент, это IPC :: RunSession :: Simple , который возвращает объект с методами reader
и writer
.Однако метод reader
объединяет STDOUT и STDERR дочернего процесса, в то время как я хотел бы иметь возможность разделить их.