#!usr/bin/perl use strict; use warnings; use Data::Dumper qw(Dumper); my %hash; my %cars; while(<>) { chomp; next if /^\s*#/; # skip comments next unless length; # skip white lines if ($_ =~ /^CARS/) { my @car_list = split ' ', $_; shift @car_list; # or splice @car_list, 0, 1; $cars{shift @car_list} = \@car_list; } elsif ($_ !~ /^CARS/) { my @keys = keys %cars; my @values = values %cars; $hash{$_}{$keys[0]} = shift @values; delete $cars{shift @keys}; } } continue { close ARGV if eof; # Not eof()! } print Dumper \%hash; __DATA__ CARS TOYOTO Etios Innova Camry Fortuner Corolla *.This is Class cars. CARS HYUNDAI Verna i10 i20 Eon Xcent Tucson *.It is best cars. CARS HONDA City Brio Amaze Accord *.This is Luxury cars. __OUTPUT__ $ perl test.pl input.txt $VAR1 = { '*.This is Luxury cars.' => { 'HONDA' => [ 'City', 'Brio', 'Amaze', 'Accord' ] }, '*.This is Class cars.' => { 'TOYOTO' => [ 'Etios', 'Innova', 'Camry', 'Fortuner', 'Corolla' ] }, '*.It is best cars.' => { 'HYUNDAI' => [ 'Verna', 'i10', 'i20', 'Eon', 'Xcent', 'Tucson' ] } };