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;