The simple answer is to only change it lexically
my $fh-foo = open "foo.txt", :w;
{
my $*OUT = $fh-foo;
say "Hello, foo! Printing to foo.txt";
}
say "This should be printed on the screen";
my $fh-foo = open "foo.txt", :w;
with $fh-foo -> $*OUT {
say "Hello, foo! Printing to foo.txt";
}
say "This should be printed on the screen";
If you have to work around someone else's code you could reopen it the same way it was opened in the first place.
my $fh-foo = open "foo.txt", :w;
$*OUT = $fh-foo;
say "Hello, foo! Printing to foo.txt";
$*OUT = IO::Handle.new( path => IO::Special.new('<STDOUT>') ).open();
say "This should be printed on the screen";