use Sub::ScopeFinalizer qw( scope_finalizer ); { open(my $old_stdout, '>&', *STDOUT) or die; my $sentry = scope_finalizer { close(STDOUT); open(STDOUT, '>&', $old_stdout) or die; }; close(STDOUT); open(STDOUT, '>', $file) or die; ... } #### { local *STDOUT = $OLDFH; ... }