use v5.10; my $input; local $" = ", "; my $parser = qr{ (?{ say "before:\n\@- = (@-)\t\t ".scalar(@-)." items\n\@+ = (@+)\t ".scalar(@+)." items\n"; }) ^ ((?&expr)) ((?&expr)) \z (?{ say "after:\n\@- = (@-)\t\t ".scalar(@-)." items\n\@+ = (@+)\t ".scalar(@+)." items\n"; }) (?(DEFINE) (? (.) (.) (?{ say "expr:\n\@- = (@-)\t ".scalar(@-)." items\n\@+ = (@+)\t ".scalar(@+)." items\n"; }) ) ) }x; $input = "abcd"; chomp($input); if ($input =~ $parser) { say "matches: ($&)"; say "At the very end:\n\@- = (@-)\t ".scalar(@-)." items\n\@+ = (@+)\t ".scalar(@+)." items\n"; } __END__