use IO::File; my %filehandle; while (my ($k, $v) = associate_filename_with_values()) { $filehandle{$v} = IO::File->new(">$k") || die "Cannot open '$k' for writing\n"; } my $data_fh = IO::File->new($datafile) || die "Cannot open '$datafile' for reading\n"; while (<$data_fh>) { chomp; next unless length $_; my @line = split, /\s+/; my $value = $line[SOME_INDEX]; $filehandle{$value}->print("$_\n"); } $data_fh->close; $_->close for values %filehandle;