This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #70764] $' fails to initialized for pre-compiled regular expression matches
authorFather Chrysostomos <sprout@cpan.org>
Mon, 14 Dec 2009 11:19:35 +0000 (12:19 +0100)
committerRafael Garcia-Suarez <rgs@consttype.org>
Mon, 14 Dec 2009 11:19:35 +0000 (12:19 +0100)
commit69dc4b30f4725ad5f212d45d3c856ac1caaacf17
treedf18d52a4e4de66a3e51752d969e266ad1bd40f6
parentd275fa5ec19c41bfadd2caecf9152a6e9b995717
[perl #70764] $' fails to initialized for pre-compiled regular expression matches

The match vars are associated with the regexp that last matched
successfully. In the case of $str =~ $qr or /$qr/, since the $qr could
be used in multiple scopes that need their own sets of match vars, the
$qr is cloned by Perl_reg_temp_copy as of change 30677/28d8d7f. This
happens in pp_regcomp before pp_match has stringified the LHS, hence the
bug. In short, /$gror/ is not equivalent to
($which = !$which) ? /$gror/ : /$gror/, which is weird.

Attached is a patch, which admittedly is a hack, but fixes this
particular side effect of what is probably a bad design, by stringifying
the LHS in pp_regcomp, and having pp_match skip get-magic in such cases.
A real fix far exceeds my capabalities, and would also be very intrusive
according to
<http://www.nntp.perl.org/group/perl.perl5.porters/2007/03/msg122415.html>.
pp_ctl.c
pp_hot.c
t/re/qr.t