my @list= "external"; s[(?<=<)([^>]+)(?=>))]{ my $tag= $1; if( $tag eq "item" ) { "$list[-1]-$tag"; } else { if( $tag eq "end-list" ) { pop @list if 1 < @list; } elsif( $tag =~ /(\w+)-list/ ) { push @list, $1; } $tag; } }ge;