以下内容:
def foo
p $`, $&, $'
end
def bar x = $`, y = $&, z = $'
p x, y, z
end
'abc' =~ /b/
p $`, $&, $' # => 'a', 'b', 'c'
foo # => nil, nil, nil
bar # => nil, nil, nil
与regexp匹配相关的伪变量似乎在foo中重置,甚至在bar中接收部分的参数内重置。我知道这与范围有关,但我的理解是,范围之前和之外的变量通常可以从该范围内看到(除了与eval,exec等相关的一些环境),即使范围内的变量无法从外部看到。
你能告诉我这些与正则表达式相关的伪变量范围的性质吗?
答案 0 :(得分:1)
与Regexp相关的伪变量不像全局变量那样,但对于您正在使用它们的方法和线程来说是本地的。
我认为“Ruby编程”中提到了这个问题 - 你有副本吗?
要解决您的问题:请尝试仅将$backtick
和$&
中的值传递给foo
和bar
,如果他们有异常,请让他们引发异常,并让调用方法处理异常,记录$'
中的内容,然后重新引发异常:
def foo(x, y)
raise if x != "hello"
end
def caller_of_foo
begin
foo($`, $&) # Ignore this comment: `
rescue
STDERR.puts "foo raised #{$!.inspect}"
STDERR.puts "The remainder of the regexp is #{$'.inspect}"
raise
end
end