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