[perl #96230] Stop s/$qr// from reusing last pattern
authorFather Chrysostomos <sprout@cpan.org>
Tue, 16 Oct 2012 21:36:43 +0000 (14:36 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 16 Oct 2012 21:36:43 +0000 (14:36 -0700)
qr// should not be using the last-successful pattern, because it is
"(?^:)", not the empty pattern.  A stringified qr// does not use the
last-successful pattern.

This was fixed for m/$qr/ (and =~ qr//) in commit 7e31363783, but
s/$qr// was left out.

pod/perldelta.pod
pp_hot.c
t/op/qr.t

index d314937..59d6904 100644 (file)
@@ -504,10 +504,7 @@ beginning with an alphanumeric character.  [perl #105922]
 =item *
 
 An empty pattern created with C<qr//> used in C<m///> no longer triggers
-the "empty pattern reuses last pattern" behaviour.  C<s///> has not yet
-been fixed.  [perl #96230]
-
-XXX There is no reason s/// should not be fixed before 5.17.5.  Nag sprout.
+the "empty pattern reuses last pattern" behaviour.  [perl #96230]
 
 =item *
 
index 9d28855..13123bb 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -2133,7 +2133,8 @@ PP(pp_subst)
                                   position, once with zero-length,
                                   second time with non-zero. */
 
-    if (!RX_PRELEN(rx) && PL_curpm) {
+    if (!RX_PRELEN(rx) && PL_curpm
+     && !((struct regexp *)SvANY(rx))->mother_re) {
        pm = PL_curpm;
        rx = PM_GETRE(pm);
     }
index 4130799..29f2773 100644 (file)
--- a/t/op/qr.t
+++ b/t/op/qr.t
@@ -7,7 +7,7 @@ BEGIN {
     require './test.pl';
 }
 
-plan(tests => 19);
+plan(tests => 20);
 
 sub r {
     return qr/Good/;
@@ -63,3 +63,7 @@ like("$e", qr/\Stew=SCALAR\(0x[0-9a-f]+\)\z/);
 # [perl #96230] qr// should not have the reuse-last-pattern magic
 "foo" =~ /foo/;
 like "bar",qr//,'[perl #96230] =~ qr// does not reuse last successful pat';
+"foo" =~ /foo/;
+$_ = "bar";
+$_ =~ s/${qr||}/baz/;
+is $_, "bazbar", '[perl #96230] s/$qr// does not reuse last pat';