まつもと ゆきひろです

In message "Re: [ruby-dev:36750] [Bug #650] Marshal.load raises RegexpError"
    on Wed, 15 Oct 2008 22:59:59 +0900, Shyouhei Urabe <redmine / ruby-lang.org> writes:

|以下のように、以前のバージョンのRubyで正しくdumpしたはずの文字列をtrunkでloadできません。
|
| % ruby1.8 -e 'Marshal.dump(/C:\Documents and Settings\urabe/, STDOUT)' | ruby1.8 -ve 'p Marshal.load(STDIN)'
| ruby 1.8.7 (2008-10-11 revision 17572) [x86_64-linux]
| /C:\Documents and Settings\urabe/

1.9では正規表現に\uが増えたからですね。

厳密に言うとmarshalに上位互換性がないのでmarshalのメジャーバー
ジョンを変化させるべきなのかもしれませんが、メリットよりもデ
メリットの方が大きいのでそれはしない方向を考えてます。

で、1.8の方のregexpに手を入れて「\u」は「u」に正規化しようと
思います。そうすると、上のだと

  C:\Documents and Settingsurabe

になってしまうわけですが、もともと\Dは[0-9]という意味で、上の
正規表現はもともとパスにはマッチしないんで、これはこういうも
のだと思ってください。バックスラッシュを含むパターンはちゃん
と\\に変換してくださいということで。

                                まつもと ゆきひろ /:|)