\1 обратная ссылка, которая будет только работать в том же sub
или gsub
вызов метода, например:
"foobar".sub(/foo(.*)/, '\1\1') # => "barbar"
1$ является глобальной переменной, которая может использоваться в более позднем коде:
if "foobar" =~ /foo(.*)/ then
puts "The matching word was #{$1}"
end
Вывод:
"The matching word was bar"
# => nil
Следует иметь в виду, что существует третья опция, клеточный вид sub
. Иногда Вам нужен он. Скажите, что Вы хотите заменить некоторый текст реверсом того текста. Вы не можете использовать 1$, потому что он не связывается достаточно быстро:
"foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1,
# or gives an error if $1 is unbound
Вы также не можете использовать \1
, потому что sub
метод просто делает простую текстовую замену \1
с соответствующим полученным текстом, нет никакого волшебства, происходящего здесь:
"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\'
Поэтому, если Вы хотите сделать что-либо необычное, необходимо использовать клеточный вид sub
(1$, 2$, $ ', $' и т.д. будет доступен):
"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof'
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab'