なひです.

> From: "Ayanosuke" <aya / big.or.jp>
> Sent: Tuesday, February 08, 2000 1:05 PM

> > > > _を空白に置換したいのですが、\_は置換したくないのです。
> > > 
> > > >a.gsub(/([^\\])[_]/){$1+" "}
> > > 
> > > 適用範囲によりますが、これだと先頭の _ は置換できないので、
> > > 次のようにした方が安全かも知れません。
> > > 
> > > a.gsub(/(^|[^\\])_/, '\1 ')
> > 
> > a.gsub( /(\G|[^\\])_/, '\1 ' )
> > 
> > のほうが...あれ? \Gないんだったっけ.えーと,
> 
>  もしあったとして、どういう時にうれしいんでしょう?

\Gの機能を使わずに,例えば上のほうの例で,
"______" などを置換してみてください.

> \G ...Perl5.005で新たに導入された正規表現で
>   直前にm//gがマッチしていた場所にのみマッチする。
>   /gが指定されていたときのみ動作する。
> 
> ということらしいですが、うれしさが分からない・・・。

わかりますか? ^^;

> >   b = a.dup
> >   nil while b.sub!( /(^|[^\\])_/, '\1 ' )
> > 
> > かな?
> > 
> > # 1.5.2では
> > #   nil while b.sub!( /(^|[^\\])_/, '\1 ' ) && $~
> > # ですね.^^;
> 
>  1.4.3と1.5.2が違う理由が、さっぱりわからないですが、こういう
> ものなんですね。きっと。

ruby-devでしばらく議論されているのですが,
現在の仕様では,もし置換が行われなかったときに,
subとgsubはもとの文字列(置換されてない)を返すのに対し,
sub!とgsub!はnilを返すのです(置換失敗を表す).

1.5.2では実験的に,sub!とgsub!ももとの文字列を返すようになりました.
そのため,$~による置換失敗チェックが必要なのです.

--
NaHi, nakahiro, a.k.a. NAKAMURA, Hiroshi
http://www.sarion.com  Sarion Systems Research