in reply to Replace the nth occurence

I came across this thread whilst looking to do something more complex. Essentially the most general regex case where the replacement might have $1 etc in it. Thought I'd post my solution, along with the comments I put in my code (note that the e(vals) aren't a concern for my usage, but others might want to guard against injection):
# We want to replace the $nth match of $regex in $value # with $replacement # OK, so doing the nth regex replacement in a string just # isn't going to be that readable, but at least it's # concise. I'll try to explain: # As we go through the regex matches we want to count # down from $nth to zero being when we want to replace. # $& is just what we matched, so we'll write that when # we're not replacing ie when $nth!=0. # qq{} is just quotation that saves us escaping ' or " in # the quotation string. # So here we're creating a string where $replacement is # parsed into quotations eg --$nth ? $& : qq{new text $1} $rep_eval = "--\$nth ? \$& : qq{$replacement}"; # Then here we have our usual regex search and replace # which we perform g(lobally) and e(val) twice. # 1st e(val) parses $rep_eval, and the 2nd evaluates the # "<if> ? <true> : <false>" expression for each match. $value =~ s/$regex/$rep_eval/gee;