use Data::Dumper; my $path; my @data; my $final = {}; while (){ last if /^__END__$/; # stop when __END__ is encountered s/\n//gsi; s/=/./gsi; push (@data,$_); } foreach (@data){ print "$_ \n"; createHash($_); } print Dumper(\$final); sub createHash{ my $val = shift; my @x = split('\.',$val); my $i = 0; my $f = {}; while($i < scalar(@x)){ $f->{$x[$i+1]} = '['.$x[$i+2].']'; if(exists($final->{$x[$i]})){ print "second\n"; ($final->{$x[$i]}, $f); } else{ print "first\n"; $final->{$x[$i]} = ($final->{$x[$i]}, $f); } $i = $i+3; #print Dumper(\$final); } } use XML::Simple; $path = 'text2xml.xml'; open my $fh, '>:encoding(iso-8859-1)', $path or die "open($path): $!"; XMLout($final, OutputFile => $fh); __DATA__ a.b='xyz' a.c='abc' d='def' a.e='ghi' __END__ ## expected output xyz abc ghi de