my @stack; while ($file =~ m{\G(.*)<\?(.*)\?>}gms) { my $pre = $1; my $pi = $1; my @args = split(' ', $pi); # hopefully this always works my $pi_cmd = uc($args[0]); if ($pi_cmd eq 'CLG.MDFO') { # parse next element tag if ($file =~ m{\G\s*<\s*([^>\s]*?)(.*?)>}gms) { my $element = $1; push(@stack, $element); } } elsif ($pi_cmd eq 'CLG.MDFC') { # parse previous element tag if ($pre =~ m{<\s*([^>\s]*?)([^>]*)>\s*\z}ms) { my $element = $1; unless ($element eq pop(@stack)) { ...emit mismatch warning ... } } } } if (@stack) { ...emit unterminated CLG.MDFO warning... } #### ## my $pre_element; my @stack; while ($file =~ m{...regex for a pi...}) { my $pre = $1; ... if ($pi_cmd eq 'CLG.MDFO') { ...same as above... } else { if ($pre =~ m{...regex for element tag...\z}) { $pre_element = $1; } if ($pi_cmd = 'CLG.MDFC') { unless ($pre_element = pop(@stack)) { ... } } } }