gpt4 book ai didi

perl 在 windows 中合并输出和 stderr 和过滤器行

转载 作者:行者123 更新时间:2023-12-04 05:46:45 25 4
gpt4 key购买 nike

我想在 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";

线
open(STDERR, ">&FILEHANDLE");

是我尝试重定向 stderr 以便能够使用 stdout 处理它的地方,但它不起作用。

该解决方案必须在 Windows 中工作。

最佳答案

参数中的 shell 重定向到 open可以在这里提供帮助:

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

现在 FILEHANDLE将看到来自 Mycmd 的标准输出和标准错误的每一行.

使用多参数 open和重定向输出,你必须更加慎重。说 Mycmd
#! /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 errorgot [standard output]

Notice that the standard output from Mycmd passed through the driver program but not its standard error. To get both, you have to mimic the shell’s redirection.

#! /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";
}

现在输出是

得到 [标准错误]
得到 [标准输出]

关于perl 在 windows 中合并输出和 stderr 和过滤器行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10585120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com