我想在子进程中禁止输出,并且仅读取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
上的perlcritic
,如下所示:# 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);
但是
select
不喜欢using of ojit_code 。还有更优雅的解决方案吗?
最佳答案
最小的更改只是通过将其更改为* 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);
关于perl - 与perlcritic一起使用IPC::Open3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20393647/