使用带有perlcritic的IPC :: Open3

我想在子进程中压缩输出并只读取stderr. perlfaq8建议做以下事项:

# To capture a program's STDERR,but discard its STDOUT:
use IPC::Open3;
use File::Spec;
use Symbol qw(gensym);
open(NULL,">",File::Spec->devnull);
my $pid = open3(gensym,">&NULL",\*PH,"cmd");
while( <PH> ) { }
waitpid($pid,0);

但随后,perlcritic在using bareword file handles辩论.

我唯一可以设计的是在STDOUT上选择新打开的描述符到/ dev / null,如下所示:

# To capture a program's STDERR,but discard its STDOUT:
use IPC::Open3;
use File::Spec;
use Symbol qw(gensym);
open my $null,File::Spec->devnull;
my $old_stdout = select( $null );
my $pid = open3(gensym,">&STDOUT","cmd");
select( $old_stdout );
while( <PH> ) { }
waitpid($pid,0);

但是,perlcritic并不喜欢using of select.
有更优雅的解决方案吗?

解决方法

最小的改变就是通过将NULL更改为* NULL来使open中的NULL不再是一个裸字.

使用这种形式的句柄通常被认为是不好的形式(因为它们是全局变量,尽管你可以通过对它们应用local来使它们更不全局化).因此我建议将其更改为使用我的变量来处理所有句柄.它看起来像你丢弃stdin文件句柄,所以也可以传递null文件句柄(注意我在读写模式下打开它)

use strict;
use warnings;

use IPC::Open3;
use File::Spec;
use Symbol qw(gensym);

open(my $null,'+>',File::Spec->devnull);

my $childErr = gensym;

my $pid = open3($null,$null,$childErr,"cmd");

while(<$childErr>) { }
waitpid($pid,0);

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...