use warnings; use strict; my $user_defined_string = "There's more than one way to do it (more than one)."; my $user_defined_search = '(more)(.*?)(one)'; my $user_defined_replace = '$1$2$3'; my (@subs) = $user_defined_string =~ /$user_defined_search/; for my $sub (1..@subs) { $user_defined_replace =~ s/\$$sub/$subs[$sub-1]/ge; } print "mangled replace: $user_defined_replace\n"; $user_defined_string =~ s/$user_defined_search/$user_defined_replace/ge; print "after: $user_defined_string\n"; __OUTPUT__ mangled replace: more than one after: There's more than one way to do it (more than one).