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)) { ... } } } }