PATCH: [perl #133984] Failure in lookbehind
authorKarl Williamson <khw@cpan.org>
Fri, 22 Mar 2019 20:54:33 +0000 (14:54 -0600)
committerKarl Williamson <khw@cpan.org>
Fri, 22 Mar 2019 21:01:39 +0000 (15:01 -0600)
I thought that lookbehind assertions weren't supposed to look beyond the
current position; but this CPAN module demonstrates that they can look
ahead as well.

I built some infrastructure to prevent them from looking ahead.  In
part, this is because Unicode recommends that pattern matching have the
ability to restrict the area of the target being matched.  That
infrastructure is not needed at this time.  But I think we should leave
it in for now anyway, as we see what other bugs the variable length
lookbehind changes may have caused.

So this patch just takes the easy way out, and at the place where it
would restrict the area searched, it uses the full width.  It's a one
line change.

regexec.c
t/re/pat_advanced.t

index 45a817a..00e822d 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -8725,8 +8725,8 @@ NULL
                 PERL_UINT_FAST8_T back_count = scan->flags;
                char * s;
 
-                /* Lookbehind ends here */
-               ST.end = locinput;
+                /* Lookbehind can look beyond the current position */
+               ST.end = loceol;
 
                 /* ... and starts at the first place in the input that is in
                  * the range of the possible start positions */
index 21a43b8..98a8994 100644 (file)
@@ -2345,6 +2345,10 @@ EOF
     is (scalar split(/\b{sb}/, "Don't think twice.  It's all right."),
         2, '\b{wb} splits sentences correctly');
 
+    ok "my/dir/audio_07.mp3" =~
+     qr/(.*)\/(.*)\/(.*)\.(?<=(?=(?:\.(?!\d+\b)\w{1,4}$)$)\.)(.*)$()/,
+     "[perl #133948]";
+
 
     # !!! NOTE!  Keep the following tests last -- they may crash perl