Gsub으로 동일한 코드를 실행해도 결과가 다른 경우

$1와 같은 변수는 정규식 매칭이 수행된 이후에 값이 채워집니다. 예시를 조금 단순화하면 다음과 같습니다:

s.gsub('original(value)', "replacement#{$1}")

"replacement#{$1}" 식은 gsub 함수가 호출되기 전에 평가됩니다. 따라서 $1은 이전의 어떤 정규식 작업에서 남게 된 값이 됩니다. (그것이 두 번째 시도가 작동하는 이유입니다 — 첫 번째 시도의 $1을 가져오기 때문이죠)

이 문제를 해결하는 몇 가지 옵션이 있습니다. gsub에는 다양한 기능이 있습니다.

제 선호도는 gsub에 블록을 전달하는 것입니다. 블록은 정규식이 매칭된 후에 평가되므로 $1은 예상대로 작동합니다:

s.gsub('original(value)') { |match| "replacement#{$1}" }

또는 gsub의 ‘백레퍼런스(backreference)’ 기능을 사용할 수도 있습니다. 이 문법은 좋아하지 않지만, 작동은 합니다. "replacement#{$1}" 대신 'replacement\1' (또는 \2, \3 등)를 사용합니다.

s.gsub('original(value)', 'replacement\1')