How about using 'local'?
#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11164860 use warnings; sub divertSTDERR { my ($sub) = @_; my $buffer; local *STDERR; open STDERR, '>', \$buffer or die "open failed $!"; $sub->(); chomp $buffer; return $buffer; } my $buf = divertSTDERR( \&handleInner ); warn "output from handleInner:\n>>$buf<<\n"; warn "\n##################################################\n\n"; $buf = divertSTDERR( \&handleOuter ); warn "output from handleOuter:\n>>$buf<<\n"; sub handleInner { warn "inside handleInner\n"; } sub handleOuter { warn "before inner divert\n"; my $buf = divertSTDERR( \&handleInner ); warn "after inner divert\n"; warn "handleOuter returns >>$buf<< from handleInner\n"; }
Outputs:
output from handleInner: >>inside handleInner<< ################################################## output from handleOuter: >>before inner divert after inner divert handleOuter returns >>inside handleInner<< from handleInner<<
Is this doing what you want?
In reply to Re: Nested redirect for STDERR to a string buffer within a perl program
by tybalt89
in thread Nested redirect for STDERR to a string buffer within a perl program
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |