Perl IPC:Open3 минимально, чтобы пройти perlcritic?

Я читаю документацию perlcritic, чтобы избежать обратных кавычек и использовать IPC::Open3 здесь:

http://perl-critic.stacka.to/pod/Perl/Critic/Policy/InputOutput/ProhibitBacktickOperators.html

Я пытаюсь найти наименее подробный вариант, который будет работать и удовлетворять perlcritic:

#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open3 'open3'; $SIG{CHLD} = 'IGNORE';
my $cmd = 'ls';
my ($w,$r,$e); open3($w,$r,$e,$cmd);
my @o = <$r>; my @e = <$e>;
1;

Но он жалуется на следующую ошибку:

Use of uninitialized value in <HANDLE> at ipc_open3.pl line 7

Есть идеи?

Отредактировано: хорошо, вот что у меня есть. Если нет способа упростить его, я буду придерживаться этого:

#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open3 'open3'; $SIG{CHLD} = 'IGNORE';
use Symbol 'gensym';
my $cmd = 'ls';
my ($w,$r,$e) = (undef,undef,gensym); my $p = open3($w,$r,$e,$cmd);
my @o = <$r>; my @e = <$e>;
1;

2 ответа

Решение

Параметр ошибки для IPC::Open3::open3 не должно быть неопределенным. Синопсис дляIPC::Open3 использует Symbol::gensym Функция для предварительной инициализации аргумента ошибки:

my($wtr, $rdr, $err);
use Symbol 'gensym';
$err = gensym;
$pid = open3($wtr, $rdr, $err, 'some cmd and args', 'optarg', ...);

Входные и выходные параметры могут быть заменены автоматически сгенерированными файловыми дескрипторами, так что это нормально для передачи undef за эти аргументы.

Конечно, наименее подробный вариант для удовлетворения perlcritic здесь

my @o = `ls 2>/dev/null`   ## no critic

Совет на этой странице ужасен. IPC::Open3 - это низкоуровневый модуль, который сложно использовать. Сам код, предлагаемый на странице, будет зависать (тупик), если лоты отправляются в STDERR.

Вместо этого используйте IPC::Run3 или IPC:: Run.

Примеры:

run3 $cmd, undef, \my $out, \my $err;
run3 [ $prog, @args ], undef, \my $out, \my $err;
run3 [ $prog, @args ], undef, \my @out, \my @err;
Другие вопросы по тегам