From 4f4d7508b0c2c114e5f52420e0e87a853c5f642a Mon Sep 17 00:00:00 2001 From: David Caldwell Date: Mon, 23 Nov 2009 17:24:25 -0800 Subject: Add s///r (non-destructive substitution). This changes s/// so that it doesn't act destructively on its target. Instead it returns the result of the substitution (or the original string if there was no match). In addition this patch: * Adds a new warning when s///r happens in void context. * Adds a error when you try to use s///r with !~ * Makes it so constant strings can be bound to s///r with =~ * Adds documentation. * Adds some tests. * Updates various debug code so it knows about the /r flag. * Adds some new 'r' words to B::Deparse. --- pp_ctl.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'pp_ctl.c') diff --git a/pp_ctl.c b/pp_ctl.c index 2408a7b16e..7b94587fd2 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -325,7 +325,10 @@ PP(pp_substcont) SvPV_set(dstr, NULL); TAINT_IF(cx->sb_rxtainted & 1); - mPUSHi(saviters - 1); + if (pm->op_pmflags & PMf_NONDESTRUCT) + PUSHs(targ); + else + mPUSHi(saviters - 1); (void)SvPOK_only_UTF8(targ); TAINT_IF(cx->sb_rxtainted); -- cgit v1.2.1