青山です。

Tue, Mar 16, 1999 at 02:50:18PM +0900 において
Yukihiro Matsumoto さん曰く:

> |default              /s /m の指定無し $*=0    ^$ は文字列 . は \n 含まず
> |single-line          /s の指定時              ^$ は文字列 . は \n 含む
> |multi-line           /m の指定時              ^$ は改行   . は \n 含まず
> |clean multi-line     /m と /s の両方指定      ^$ は改行   . は \n 含む
> |obsolute multi-line  /s /m の指定無し $*=1    ~$ は改行   . は \n 含まず
> 
> げげげ,そういえば $* の指定と /s /m は働きが違うと以前聞い
> たことを思い出しました.しかし,たかが正規表現のオプションに
> こんなに組合せがあってしまうのが,さすがperlというかなんとい
> うか.

凄いですよね。[ruby-dev:6331] に書いたように \A \Z が無い Perl 4 での
対応策としてこのようになってしまったのでしょう。という事で \A \Z があ
る場合は ^$ に関しては動作の切替えは必要なく、. についてのみ考えれば良
いと思います。(ただし、^$ の動作自体の検討はまだ必要ですが)

> ではrubyではどうするかということを考えると,
> 
>   * そもそも変更する必要があるか
. については要望しだい、$ については変更しないとしても検討が必要でしょう。
>   * もう大域変数を導入しないので $* 相当は採用しない
\A \Z があるので不要ですしね。
>   * ^$と.を独立に制御する必要が無ければ /m で実現「できる」
^$ の動作を現在のままとすれば . の動作変更用という事でいいかも。
>   * 独立に制御する必要があるのなら別のオプションを用意(/a?)
$* と同じく \A \Z があるので不要であるはず。
>   * デフォルトはどうするか
現在のまま。

というあたりでしょうか。まとめると、基本的には現在のままで、. の動作変
更が必要であれば /m を導入。これで文字列の先頭、末尾、改行の直前、直後、
. に改行を含む、含まないの全てを指定できるので、実用上は Perl とかわら
ないと思います。

"\n" =~ /\n$/ をどうするかという事が最も難しい問題点ですね。

> |"\n" =~ /\n$/ については [ruby-dev:6277] に書いたように、^ の挙動から
> |すると $ の挙動が変ではないかという疑問はあります。
> 
> そーですねえ.やはり,すべからく \Z であるべきなんでしょうか?

? これは \Z の件とは別です。文字列の末尾に改行の無い空行がある場合、
それを行としてみなすかどうかという問題です。[ruby-dev:6309] の問題です
ね。


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