我想在子进程中禁止输出,并且仅读取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);

但随后perlcriticusing 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/

10-15 04:57