use strict; use Data::Dumper; use XML::Simple; my $str = do { local $/=undef; }; LOOP: { for ($str) { # Make start/end tags for current level s#^(\w+)(.*?)(?=^[\w<]|\Z)#<$1>$2\n\n#smg; # Process next level s/^\t//mg or last LOOP; } redo LOOP; } my $xs = XML::Simple->new(suppressempty=>''); # Add root element my $href = $xs->XMLin("$str"); print Dumper($href); __DATA__ abc def ghi jkl mno pqr