有没有办法将子程序的打印输出捕获到变量,所以我可以将它发送到stderr?

gra*_*tas 8 perl stderr

假设我们有:

sub test {
        print "testing\n";
}
Run Code Online (Sandbox Code Playgroud)

如果有一种情况我想让它打印到stderr而不是stdout,有没有办法我可以调用子程序来做到这一点?或者我可以将输出捕获到变量然后使用警告?我对perl很新.

mob*_*mob 12

就在这里.print将其输出发送到"选定"文件句柄,这通常是STDOUT.但Perl提供了select更改它的功能.

select(STDERR);
&test;           # send output to STDERR
select(STDOUT);  # restore default output handle
Run Code Online (Sandbox Code Playgroud)

select函数返回先前选择的文件句柄,因此您可以捕获它并在以后恢复它.

my $orig_select = select(STDERR);
&test;
select($orig_select);
Run Code Online (Sandbox Code Playgroud)


pil*_*row 9

通常不会使用Perl通过local()的动态范围,但这对我来说是一个很好的应用程序:

test(); # to stdout
{
    open(local *STDOUT, ">&STDERR") or die "dup out to err: $!";
    test(); # to stderr, locally calling it "STDOUT"
}
test(); # to stdout again
Run Code Online (Sandbox Code Playgroud)

test()上面的块中的调用- 以及它test()自己可能调用的任何东西- 都会将STDOUT动态地限定为您的STDERR副本.当控制离开块时,即使通过die()ing,STDOUT也将恢复到块之前的状态

广义:

sub out2err(&) {
  my $user_block = shift;
  open(local *STDOUT, ">&STDERR") or die $!;
  $user_block->();
}

test();             # to stdout
out2err { test() }; # to stderr
test();             # to stdout
Run Code Online (Sandbox Code Playgroud)