【发布时间】:2013-12-22 00:26:48
【问题描述】:
我想抑制子进程中的输出并只读 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 争论。
我唯一能想到的是将select 新打开的描述符改为/dev/null,而不是STDOUT,如下所示:
# 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", \*PH, "cmd");
select( $old_stdout );
while( <PH> ) { }
waitpid($pid, 0);
但是perlcritic 不喜欢using of select。
有没有更优雅的解决方案?
【问题讨论】:
-
您的
select实际上并没有做任何事情!select不会改变STDOUT。 -
perlcritic 经常是错误的。
标签: perl perl-critic ipcopen3