use strict; use warnings; use Data::Dumper; my $data1 = <) { chomp; my @attr = split /[|]/; @{ $hash->{join '|', @attr[@$keys]} }[ @$out ] = @attr[ @$in ]; } close $fh; } my %result; process_file( \$data1, [0,3,4], [0..6], [0..6], \%result ); process_file( \$data2, [0,3,4], [0,3,4,5..8], [0,3,4,7..10], \%result ); print Dumper \%result;