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.