my @stack; my $ind=0; while () { if (/^\s*Begin\s+(\w+)\s+(\w+)$/) { print (' ' x $ind) . "<$1 name='$2'>\n"; push @stack,$1; $ind += 3; } elsif (/^\s*End\s*/) { $ind -= 3; print (' ' x $ind) . "<" . (pop @stack) . ">\n"; } else { print (' ' x $ind) . "<$_>\n"; # change to print tag however you want } }