#!/usr/bin/perl # http://perlmonks.org/?node_id=1142802 # want inner child first use strict; use warnings; $_ = join '', ; my @elements; s/\K(\w+)(?=<\/mml:msub>)/$1<\/A>/g; push @elements, $1 while s/((?:(?!).)*?<\/mml:msub>)/ '<' . @elements . '>'/se; for my $n (1..@elements) { local $_ = $elements[$n - 1]; 1 while s/<(\d+)>/$elements[$1]/; print "$n: $_\n\n"; } __DATA__ Goa abu China poland swift a miot Canada police bangalore