Add tests for RT #84294 /((\w+)(?{print $2})){2,2}/ problem
authorYves Orton <demerphq@gmail.com>
Sat, 12 Mar 2011 16:17:22 +0000 (17:17 +0100)
committerYves Orton <demerphq@gmail.com>
Sat, 12 Mar 2011 16:43:46 +0000 (17:43 +0100)
Original ticket reports:

    print "Match: \$1=$1 \$2=$2" if 'ab' =~/^((\w+)(?{print defined $2 ? "\$2=$2\n" : "\$2 not defined\n"})){2}$/;

Produces the following incorrect output:

    $2=ab
    $2 not defined
    $2=b
    Match: $1=b $2=b

It should produce:

    $2=ab
    $2=a
    $2=b
    Match: $1=b $2=b

This adds a TODO test to verify this behavior.

t/re/pat.t

index 66ce5ea..aa19030 100644 (file)
@@ -21,7 +21,7 @@ BEGIN {
     require './test.pl';
 }
 
-plan tests => 449;  # Update this when adding/deleting tests.
+plan tests => 451;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -1157,6 +1157,17 @@ sub run_tests {
        }
        ok($count < 10, 'RT #3516 C');
     }
+    {
+        # RT #84294: Is this a bug in the simple Perl regex?
+        #          : Nested buffers and (?{...}) dont play nicely on partial matches
+        our @got= ();
+        ok("ab" =~ /((\w+)(?{ push @got, $2 })){2}/,"RT #84294: Pattern should match");
+        local $::TODO= "not fixed yet";
+        my $want= "'ab', 'a', 'b'";
+        my $got= join(", ", map { defined($_) ? "'$_'" : "undef" } @got);
+        is($got,$want,'RT #84294: check that "ab" =~ /((\w+)(?{ push @got, $2 })){2}/ leaves @got in the correct state');
+    }
+
 } # End of sub run_tests
 
 1;