diff options
author | Yves Orton <demerphq@gmail.com> | 2023-03-13 18:46:41 +0100 |
---|---|---|
committer | Yves Orton <demerphq@gmail.com> | 2023-03-14 20:09:01 +0800 |
commit | d80a076d049633e9d4622d7f4561cd0cc13177b5 (patch) | |
tree | dc564783fd7b92d6c6239115ec64c94a81ce7572 /mg.c | |
parent | 6c12e0ee216a4005debef2334035abf818726587 (diff) | |
download | perl-d80a076d049633e9d4622d7f4561cd0cc13177b5.tar.gz |
mg.c - add support for ${^LAST_SUCCESSFUL_PATTERN}
This exposes the "last successful pattern" as a variable that can be
printed, or used in patterns, or tested for definedness, etc. Many regex
magical variables relate to PL_curpm, which contains the last successful
match. We never exposed the *pattern* directly, although it was
implicitly available via the "empty pattern". With this patch it is
exposed explicitly. This means that if someone embeds a pattern as a
match operator it can then be accessed after the fact much like a qr//
variable would be.
@ether asked if we had this, and I had to say "no", which was a shame as
obviously the code involved isn't very complicated (the docs from this
patch are far larger than the code involved!). At the very least
this can be useful for debugging and probably testing. It can also
be useful to test if the /is/ a "last successful pattern", by checking
if the var is defined.
Diffstat (limited to 'mg.c')
-rw-r--r-- | mg.c | 8 |
1 files changed, 8 insertions, 0 deletions
@@ -1066,6 +1066,14 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) else sv_set_undef(sv); } + else if (strEQ(remaining, "AST_SUCCESSFUL_PATTERN")) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { + sv_setrv_inc(sv, MUTABLE_SV(rx)); + sv_rvweaken(sv); + } + else + sv_set_undef(sv); + } break; case '\017': /* ^O & ^OPEN */ if (nextchar == '\0') { |