Variabili come $1 vengono popolate dopo l’esecuzione di una corrispondenza regex. Semplificando un po’ il tuo esempio:
s.gsub('original(value)', "replacement#{$1}")
L’espressione "replacement#{$1}" viene valutata prima che venga chiamata la funzione gsub. Quindi $1 conterrà il valore residuo di un’attività regex precedente. (È per questo che il tuo secondo tentativo funziona: prende $1 dal primo tentativo)
Ci sono alcune opzioni per risolvere questo problema. gsub offre molte funzionalità diverse.
La mia preferenza è passare un blocco a gsub. Il blocco viene valutato dopo che la corrispondenza regex è stata trovata, quindi $1 funzionerà come ti aspetti:
s.gsub('original(value)') { |match| "replacement#{$1}" }
In alternativa, puoi utilizzare la funzionalità di “backreference” di gsub. Non sono un fan di questa sintassi, ma funziona. Invece di usare "replacement#{$1}", usa 'replacement\1' (o \2, \3, ecc.)
s.gsub('original(value)', 'replacement\1')