use warnings; use strict; use Data::Dumper; my @accounts = ("A x1 B y1 C z1 D v1 E w1 F", "A x2 B y2 C zzz2 D v2 E w2 F", "A x3 B y3 C z3 D v3 E w3 F", "A x4 B y4 C z4 D v4 E wwww4 F", "A x5 B y5 C z5 D v5 E w5 F", "A x6 B y6 C z6 D v6 E F"); my %fields = map { $_ => 1 } qw/A B C D E F/; my $cur_field; my %hash; foreach ( @accounts ) { foreach ( split ) { $cur_field = $_ if exists $fields{$_}; push @{$hash{$cur_field}}, $_ if $_ ne $cur_field; } } print Dumper \%hash; __END__ $VAR1 = { 'A' => [ 'x1', 'x2', 'x3', 'x4', 'x5', 'x6' ], 'B' => [ 'y1', 'y2', 'y3', 'y4', 'y5', 'y6' ], 'C' => [ 'z1', 'zzz2', 'z3', 'z4', 'z5', 'z6' ], 'D' => [ 'v1', 'v2', 'v3', 'v4', 'v5', 'v6' ], 'E' => [ 'w1', 'w2', 'w3', 'wwww4', 'w5' ] };