In article <1017646574.818891.31048.nullmailer / ev.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> 今のところないです。binding(n=0)が実現すれば外のスコープにも
> 触れるようになると思うのですが、実装に問題があってインタプリ
> タ総書き換えをしないと現実的には実現できそうにありません。
> 残念。

ふと、

% ./ruby -e '
def m(&block)
eval("$~ = nil", block)
end
/a/ =~ "a"
p $~
m {}
p $~
'
#<MatchData:0x810ac14>
nil

というのが可能であることに気がつきました。まぁ、block が渡されなければ
使えないのでいつでも使えるとは限りませんが。

たとえば scan の wrapper は次のように書けるようです。

% ruby -e '
"abc".scan(/./) { p $~.to_a }

class String
  def scan2(*args, &block)
    scan(*args) {|arg|
      Thread.current[:scan2] = $~
      eval("$~ = Thread.current[:scan2]", block)
      yield arg
    }
  end
end

"abc".scan2(/./) { p $~.to_a }
'
["a"]
["b"]
["c"]
["a"]
["b"]
["c"]

いやはやなんとも難しいですね。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)