sub dyn_replace { my ($replace) = @_; my @groups; { no strict 'refs'; $groups[$_] = $$_ for 1 .. $#-; # the size of @- tells us the number of capturing groups } $replace =~ s/\$(\d+)/$groups[$1]/g; return $replace; } #### my $pat = qr/foo(\d+)bar(\d+)/; my $rep = 'x$1y$2'; my $str = 'foo36bar47'; $str =~ s/$pat/dyn_replace($rep)/e; print "$str\n";