use warnings; use strict; my @template; my %data; while (<>) { chomp; my @line = split(/\|/, $_); if (!@template) { @template = @line; } else { my $key = lc($line[2]."_".substr($line[1],0,1)); @{$data{$key}}{@template} = @line; } } use Data::Dumper; print Dumper(\%data);