regexp-match相关伪变量的范围

时间:2011-03-07 00:18:27

标签: ruby regex scope

以下内容:

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等相关的一些环境),即使范围内的变量无法从外部看到。

你能告诉我这些与正则表达式相关的伪变量范围的性质吗?

1 个答案:

答案 0 :(得分:1)

与Regexp相关的伪变量不像全局变量那样,但对于您正在使用它们的方法和线程来说是本地的。

我认为“Ruby编程”中提到了这个问题 - 你有副本吗?

要解决您的问题:请尝试仅将$backtick$&中的值传递给foobar,如果他们有异常,请让他们引发异常,并让调用方法处理异常,记录$'中的内容,然后重新引发异常:

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