青山です。

Mon, Mar 15, 1999 at 06:06:02PM +0900 において
Yukihiro Matsumoto さん曰く:

> |:+	* regex.c (re_match): begline should not match at the point
> |:+	  between a newline and end-of-string.  endline neither.
> |
> |rfc822.rb がこれにもろ依存してました.
> |(/\n$/ =~ "\n" は 990315 から nil)
> |ちらっと見た感じだといっぱいあってどうすべきか悩んでしまう.
> 
> あー,そーかあ.安易に変更したけどいろいろ大変だったかも.
> どうするのが望ましいのかなあ.

元の主張を通すのならば、

$ は \n の直後にマッチするアンカーであるから、/\n$/ という表現は蛇足で
あり、素直に /\n/ と書くべきである。また、文字列の末尾の \n にマッチさ
せたい場合は /\n\Z/ と書くべきである。

とかでしょうかね。

/\n$/ がどのように使われているのかわかりませんが、もし Perl からの移植
だとしたら、$* = 0 (//s)を指定してあるスクリプトではないかと思われます。
これは、\Z の無い Perl 4 において \Z 相当を実現する為に取られていた手法
であり、常に $* = 1 相当の挙動である Ruby では誤動作するはずです。

という事で、もし出どころがそのあたりであれば、この仕様に関係なく /\n$/
は /\n\Z/ に訂正しておくべきと思われます。

一方、/\n$/ =~ "\n" が nil には違和感があるかもという事に関しては...
難しいですね。


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>