my %Files; sub open_file { my $file_name = shift; die "$file_name is already open" if exists $Files{$file_name}; open my $FH, '>', $file_name or die "$file_name open error: $!"; $Files{$file_name} = { COUNT=>0, FH=>$FH }; } sub file_handle { my $file_name = shift; die "$file_name: Hasn't been opened yet" if ! exists $Files{$file_name}; return $Files{$file_name}{FH}; } sub file_counter { my $file_name = shift; die "$file_name: Hasn't been opened yet" if ! exists $Files{$file_name}; return $Files{$file_name}{COUNT}; } sub write_to_file { my $file_name = shift; my @stuff_to_print = @_; die "$file_name: Hasn't been opened yet" if ! exists $Files{$file_name}; my $file = $Files{$file_name}; my $FH = $file->{FH}; print $FH @stuff_to_print; ++$file->{COUNT}; } for my $file ('foo', 'bar', 'baz') { open_file($file); } for my $file ('foo', 'foo', 'baz', 'foo', 'bar') { my $count = file_counter($file); write_to_file($file, "Count is $count\n"); }