perldoc -f open has examples. Basically you duplicate STDOUT and STDERR to other filehandles before closing them. Then you duplicate the saved filehandles back to STDOUT and STDERR.
print "STDOUT #1\n";warn "STDERR #1\n";
open my $savestdout, '>&', \*STDOUT;
print "STDOUT #2\n";warn "STDERR #2\n";
open my $savestderr, '>&', \*STDERR;
print "STDOUT #3\n";warn "STDERR #3\n";
close STDOUT;
print "STDOUT #4\n";warn "STDERR #4\n";
close STDERR;
print "STDOUT #5\n";warn "STDERR #5\n";
open STDOUT, '>&', $savestdout;
print "STDOUT #6\n";warn "STDERR #6\n";
open STDERR, '>&', $savestderr;
print "STDOUT #7\n";warn "STDERR #7\n";
close $savestdout;
print "STDOUT #8\n";warn "STDERR #8\n";
close $savestderr;
print "STDOUT #9\n";warn "STDERR #9\n";
OK, this is bizarre. When I re-open
STDOUT, I get output from
warn even though
STDERR is still closed.
perldoc -f warn doesn't describe this behavior.