在windows中perl合并输出和stderr以及筛选器行

在windows中perl合并输出和stderr以及筛选器行,perl,Perl,我想用perl运行一个外部命令并过滤其中的一些行。 我不知道如何过滤到stderr的行。我现在有以下代码: #!/usr/bin/env perl use File::Spec; #open STDERR, '>', File::Spec->devnull() or die "could not open STDERR: $!\n"; open(FILEHANDLE, '-|', 'Mycmd') or die "Cannot fork: $!\n"; open(STDERR,

我想用perl运行一个外部命令并过滤其中的一些行。 我不知道如何过滤到stderr的行。我现在有以下代码:

#!/usr/bin/env perl

use File::Spec;
#open STDERR, '>', File::Spec->devnull() or die "could not open STDERR: $!\n";

open(FILEHANDLE, '-|', 'Mycmd') or die "Cannot fork: $!\n";
open(STDERR, ">&FILEHANDLE");

while(defined(my $line = <FILEHANDLE>)) {
  chomp($line);
  if( $line =~ m/text1/ or
    $line =~ m/text2/ or
    $line =~ m/text3/
  ) {
    # do nothing
  }
  else {
    print "$line\n";
  }
}
close FILEHANDLE or die "child error: $!\n";
在这里,我尝试重定向stderr,以便能够使用stdout处理它,但它不起作用


解决方案必须在windows中运行。

参数中的shell重定向到
打开
可以帮助您:

open(FILEHANDLE, 'Mycmd 2>&1 |') or die "Cannot fork: $!\n";
现在
FILEHANDLE
将看到
Mycmd
中标准输出和标准错误的每一行

要使用多参数
open
和重定向输出,您必须更加谨慎。说
Mycmd
is

#! /usr/bin/env perl
print "standard output\n";
warn  "standard error\n";
打开
“-|”
仅提供标准输出,因此如果我们运行

#! /usr/bin/env perl

use strict;
use warnings;

use 5.10.0;

my $pid = open my $fh, "-|", "Mycmd" // die "$0: fork: $!";

while (defined(my $line = <$fh>)) {
  chomp $line;
  print "got [$line]\n";
}
现在输出是

standard error got [standard output] got [standard error] got [standard output] 获得[标准错误]
获取[标准输出]您是否先关闭了
STDERR
?我认为您无法打开一个已经打开的
FH
。谢谢,我不知道这种重定向在windows中也可以工作,我对bash中的重定向很熟悉。@skeept不客气!我很高兴它有帮助,并且看到了更新的答案,您可以自己执行重定向,这样您就可以绕过shell愚蠢的参数解析。
#! /usr/bin/env perl

use strict;
use warnings;

use 5.10.0;

my $pid = open my $fh, "-|" // die "$0: fork: $!";

if ($pid == 0) {
  open STDERR, ">&STDOUT" or die "$0: dup: $!";
  exec "Mycmd"            or die "$0: exec: $!";
}

while (defined(my $line = <$fh>)) {
  chomp $line;
  print "got [$line]\n";
}
got [standard error] got [standard output]