sub munge { my ($str, $pat, $repl) = @_; while ($str =~ /$pat/g) { my $temp = $repl; for (1..$#+) { while ( (my $x = index $temp, "\$$_") >= 0) { substr ($temp, $x, length($_)+1) = $$_; } } my $pos = pos $str; my $offset = $+[$#+]-$-[0]; substr($str, $pos-$offset, $offset) = $temp; pos($str) = $pos - $offset + length($temp); } return $str; } # Here's an example: print "#"; print munge('aaaababbaabbbbabab', '(a)(b+)', ' $2*$1 '); print "#";