#!/usr/bin/perl use warnings; use strict; use Data::Dumper; my @emp = ('riya','vinoth'); my @fields = ('age','company','call','address','country','name'); my %nameh = map { $_, 1 } @emp; my %fieldh = map { $_, 1 } @fields; my @array = ( 'name riya', 'age 34', 'company xxxx', 'fax 8765432109', 'name vinoth', 'age 25', 'call 12345678', 'company xxxx', 'address asdd', 'country Ind', ); my %hash; my $name; while (@array) { my $line = shift @array; if (my ($field, $value) = $line =~ /^(.*) (.*)/) { $name = $value if 'name' eq $field; $hash{$name}{$field} = $value if ($nameh{$name} && $fieldh{$field}); } else { warn "Invalid line '$line'.\n"; } } print Dumper \%hash;