You can pass variables and file handles to subroutines. See perlsub for details. Here is an example:
use strict;
use warnings;
my %function = (
allergies => \&print_allergies,
immunizations => sub {
my ($fh, $dir) = @_;
print "\nin immunizations from directory $dir\n";
},
);
my $dir = 'input_files';
opendir DIR, $dir or die "$dir: $!";
while (defined(my $file = readdir DIR)) {
next if($file =~ /^\.+$/);
print "The directory and file are $dir/$file\n";
open my $fh, '<', "$dir/$file" or die "$dir/$file: $!";
$function{$file}->($fh, $dir) if exists $function{$file};
}
closedir DIR;
sub print_allergies{
my ($fh, $dir) = @_;
print "\nprinting allergies from directory $dir\n";
while (<$fh>){
next if (/^#/);
print $_ ;
}
}
update: added example of passing a variable other than a file handle.