http://www.perlmonks.org?node_id=1039234


in reply to ${^MATCH} sometimes fails in target of substitution?

perlre states:
As a workaround for this problem, Perl 5.10.0 introduces ${^PREMATCH} , ${^MATCH} and ${^POSTMATCH} , which are equivalent to $` , $& and $' , except that they are only guaranteed to be defined after a successful match that was executed with the /p (preserve) modifier.

Update: The problem you have documented is a bug in releases prior to 5.18.See Re: ${^MATCH} sometimes fails in target of substitution?.

Before 5.18 it appears that ${^MATCH} may only be available AFTER the match/replace. Adding print $(^MATCH} to your both example prints 'bcd' e.g.

perl -e '$x = "abcde"; $x =~ s/b../==${^MATCH}==/p; prin +t "$x Match:${^MATCH}\n"' a====e Match:bcd perl -e '$x = "abcde"; $sub="b.."; $x =~ s/$sub/==${^MATCH}==/p; print + "$x Match:${^MATCH}\n"' a==bcd==e Match:bcd

If you spot any bugs in my solutions, it's because I've deliberately left them in as an exercise for the reader! :-)

Replies are listed 'Best First'.
Re^2: ${^MATCH} sometimes fails in target of substitution?
by ikegami (Patriarch) on Jun 17, 2013 at 08:16 UTC

    If you're replacing, there was a successful match. This is a bug.

    Testing reveals this bug has been fixed:

    $ perl -v | grep 'This is' This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-li +nux-thread-multi $ perl -E'$_ = "abcde"; s/b../==${^MATCH}==/p; say' a====e $ perl -E'$_ = "abcde"; $sub="b.."; s/$sub/==${^MATCH}==/p; say' a==bcd==e
    $ perl -v | grep 'This is' This is perl 5, version 18, subversion 0 (v5.18.0) built for x86_64-li +nux-thread-multi $ perl -E'$_ = "abcde"; s/b../==${^MATCH}==/p; say' a==bcd==e $ perl -E'$_ = "abcde"; $sub="b.."; s/$sub/==${^MATCH}==/p; say' a==bcd==e

      Thanks, I amended my answer to reflect your comment and the earlier one of dave_the_m.

      If you spot any bugs in my solutions, it's because I've deliberately left them in as an exercise for the reader! :-)