#here is the output of my script $VAR1 = { 'tag1-slow' => 'Increase your speed.', 'tag1-fast' => 'Slow down boy!!!', 'tag2-fast' => 'Slow down boy!! BIG HEAD!', 'tag2-slow' => 'Increase your speed.' }; #### use strict; use warnings; use Data::Dumper; my $data = {}; my @keys; while () { chomp; if ($_ =~ /<([^>\/]*)>/) { push @keys, $1; } elsif ($_ =~ /<\/([^>]*)>/) { if ($keys[-1] eq $1) { pop @keys; } else { die "Invalid Nesting"; } } else { $data->{ join("-", @keys) } .= $_; } } print Dumper($data); __DATA__ Slow down boy!!! Increase your speed. Slow down boy!! BIG HEAD! Increase your speed.