sub transform { my ($data,$log_fh) = @_; # Localize the log filehandle so all subroutines can see it local *LOG_FH = $log_fh; ... foo($bar); } sub foo { my ($bar) = @_; print LOG_FH "Processing $bar.\n"; ... } #### sub transform { my $data = shift; local $log_fh = shift; ... foo($bar); } sub foo { my ($bar) = @_; print $log_fh "Processing $bar.\n"; ... } #### our $log_fh; sub transform { my $data = shift; print $log_fh "Processing data $data.\n"; foo("bar"); } sub foo { my ($bar) = @_; print $log_fh "Processing $bar.\n"; } sub main { open ( local $log_fh, '>', 'test.txt' ) or die "Couldn't open log file\n"; transform( "data", $log_fh ); } main();