При использовании формы регулярного выражения $ 1- $ 9, почему вызов gsub (...) для одного ноль других? - PullRequest
2 голосов
/ 27 августа 2010

Во-первых, рабочий пример:

string = "foo-bar-25-baz"
if string =~ /(.+)-(10|25)(?:-(baz))?/
  puts $1 
  puts $2
  puts $3
end

Это выдает «foo-bar», «25» и «baz» в трех строках, как и ожидалось.Но если мы сделаем это:

string = "foo-bar-25-baz"
if string =~ /(.+)-(10|25)(?:-(baz))?/
  puts $1.gsub('-', ' ') # Here be the problem
  puts $2 # nil
  puts $3 # nil
end

значения $2 и $3 теперь равны нулю.Я должен puts $2 и puts $3 и затем $1.gsub(...), и это будет работать.Насколько я могу судить, это относится только к gsub и gsub!

Это вызывает ту же проблему:

string = "foo-bar-25-baz"
if string =~ /(.+)-(10|25)(?:-(baz))?/
  puts $3.gsub('hard', 'h')
  puts $1 # nil
  puts $2 # nil
end

Я потратил около 15 минут на отладку, и мне интересно,почему.

1 Ответ

8 голосов
/ 27 августа 2010

gsub, скорее всего, переназначает эти переменные (как и любая другая функция, использующая механизм регулярных выражений). Если вам нужно вызвать gsub перед использованием всех ваших исходных результатов поиска, сначала сохраните их в локальной переменной, например, match_results = [$1, $2, $3].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...