Ruby 当使用$1-$9正则表达式表单时,为什么对其中一个调用gsub(…)会使其他的为零?

Ruby 当使用$1-$9正则表达式表单时,为什么对其中一个调用gsub(…)会使其他的为零?,ruby,Ruby,首先,一个工作示例: string = "foo-bar-25-baz" if string =~ /(.+)-(10|25)(?:-(baz))?/ puts $1 puts $2 puts $3 end 正如预期的那样,这将在三行上生成“foobar”、“25”和“baz”。但如果我们这样做: string = "foo-bar-25-baz" if string =~ /(.+)-(10|25)(?:-(baz))?/ puts $1.gsub('-', ' ') #

首先,一个工作示例:

string = "foo-bar-25-baz"
if string =~ /(.+)-(10|25)(?:-(baz))?/
  puts $1 
  puts $2
  puts $3
end
正如预期的那样,这将在三行上生成“foobar”、“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
的值现在为零。我必须
放入$2
放入$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分钟调试这个,我想知道为什么。

gsub
很可能会重新分配这些变量(就像使用regexp引擎的任何其他函数一样)。如果您需要在使用所有原始匹配结果之前调用
gsub
,请首先将它们存储到局部变量中,并使用类似
match_results=[$1,$2,$3]

+1的内容,gsub使用正则表达式查找要重放的字符串,因此将重新分配特殊变量
$1
$2
,等等!由于名称以
$
开头的变量是全局变量,您永远不知道还有什么可以更改它们的值。您完全正确,它正在分配全局变量,这很有意义。谢谢