To pass filehandles to subroutines, use the *FH or \*FH notations. These are "typeglobs"--see perldata/"Typeglobs and Filehandles" and especially perlsub/"Pass by Reference" for more information.
Here's an excerpt:
If you're passing around filehandles, you could usually just use the bare typeglob, like *STDOUT, but typeglobs references would be better because they'll still work properly under use strict 'refs'. For example:
splutter(\*STDOUT); sub splutter { my $fh = shift; print $fh "her um well a hmmm\n"; }
$rec = get_rec(\*STDIN); sub get_rec { my $fh = shift; return scalar <$fh>; }If you're planning on generating new filehandles, you could do this:
sub openit { my $path = shift; local *FH; return open (FH, $path) ? *FH : undef; } $fh = openit('< /etc/motd'); print <$fh>;