pl@nereida:~/Lperltesting$ cat ./offsetsin5_10.pl #!/usr/local/lib/perl/5.10.1/bin//perl5.10.1 use v5.10; my $input; local $" = ", "; my $parser = qr{ ^ ((?&expr)) ((?&expr)) \z (?{ say "main:\n\@- = (@-)\t\t ".scalar(@-)." items\n\@+ = (@+)\t ".scalar(@+)." items\n"; }) (?(DEFINE) (? (.) (.) (?{ say "expr:\n\@- = (@-)\t ".scalar(@-)." items\n\@+ = (@+)\t ".scalar(@+)." items\n"; }) ) ) }x; $input = <>; chomp($input); if ($input =~ $parser) { say "matches: ($&)"; #### pl@nereida:~/Lperltesting$ ./offsetsin5_10.pl abab expr: @- = (0, , , , 0, 1) 6 items @+ = (2, , , , 1, 2) 6 items expr: @- = (0, 0, , , 2, 3) 6 items @+ = (4, 2, , , 3, 4) 6 items main: @- = (0, 0, 2) 3 items @+ = (4, 2, 4, , , ) 6 items matches: (abab)