perl IPC:Open3最小通过perlcritic?

时间:2014-02-05 16:25:56

标签: perl perl-critic ipcopen3

我正在阅读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 个答案:

答案 0 :(得分:8)

该页面上的建议很糟糕。 IPC :: Open3是一个难以使用的低级模块。如果将批次发送到STDERR,页面建议的代码将挂起(死锁)。

改为使用IPC::Run3IPC::Run

示例:

run3 $cmd, undef, \my $out, \my $err;
run3 [ $prog, @args ], undef, \my $out, \my $err;
run3 [ $prog, @args ], undef, \my @out, \my @err;

答案 1 :(得分:7)

IPC::Open3::open3的错误参数不应该是未定义的。 synopsis for 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