use strict; use warnings; use Data::Dumper; my %results; while (my $line = ) { chomp $line; my @fields = split /\s+/, $line, 4; $results{ $fields[0] }{ $fields[2] } = $fields[3]; } print Dumper \%results; __DATA__ 16XX27300 $ name John Doe 16XX27300 $ name2 Bla Bla 16XX27300 $ name3 275 Main ST 16XX27300 $ mlact 16H27300 16XX27300 $ addr 8TH Floor 16XX27300 $ city SAN Fran 16XX27300 $ state CA 16XX27300 $ zip 94111 16XX27301 $ name Jane Doe 16XX27301 $ name2 Bla Bla 16XX27301 $ name3 276 Main ST 16XX27301 $ name4 Tower 2 16XX27301 $ mlact 16XX27301 16XX27301 $ addr 8TH Floor 16XX27301 $ city SAN Fran 16XX27301 $ state CA 16XX27301 $ zip 94111 #### $VAR1 = { '16XX27301' => { 'name2' => 'Bla Bla ', 'name' => 'Jane Doe ', 'name3' => '276 Main ST ', 'state' => 'CA ', 'city' => 'SAN Fran', 'zip' => '94111', 'name4' => 'Tower 2', 'mlact' => '16XX27301', 'addr' => '8TH Floor' }, '16XX27300' => { 'name2' => 'Bla Bla ', 'name' => 'John Doe ', 'name3' => '275 Main ST ', 'state' => 'CA ', 'city' => 'SAN Fran', 'zip' => '94111', 'mlact' => '16H27300', 'addr' => '8TH Floor' } };