Maybe try
open $fh, '>&', STDOUT;
behavior looks consistent when autoflush is activated.
Otherwise please use a similar code-template for a SSCCE.
use v5.12;
use warnings;
use Data::Dump qw/pp dd/;
sub tst {
my $vers = shift;
open STDOUT, ">-"; # restore STDOUT
$|=1;
say STDERR "********* testing $vers\n";
my $fh;
open $fh, ">-" if $vers eq "open2";
$fh = \*STDOUT if $vers eq "copyref";
open $fh, '>&', STDOUT if $vers eq "redirect";
$fh->autoflush;
say "$vers 1";
close STDOUT;
say $fh "$vers 2";
say "$vers 3";
}
tst("redirect");
tst("open2");
tst("copyref");
-*- mode: compilation; default-directory: "d:/tmp/pm/" -*-
Compilation started at Mon Mar 1 23:21:00
C:/Strawberry/perl/bin\perl.exe -w d:/tmp/pm/redirect_STDOUT.pl
********* testing redirect
redirect 1
redirect 2
say() on closed filehandle STDOUT at d:/tmp/pm/redirect_STDOUT.pl line
+ 32.
********* testing open2
open2 1
open2 2
say() on closed filehandle STDOUT at d:/tmp/pm/redirect_STDOUT.pl line
+ 32.
********* testing copyref
copyref 1
say() on closed filehandle STDOUT at d:/tmp/pm/redirect_STDOUT.pl line
+ 30.
say() on closed filehandle STDOUT at d:/tmp/pm/redirect_STDOUT.pl line
+ 32.
Compilation finished at Mon Mar 1 23:21:00