From: shugo@... (MAEDA Shugo) Date: 1998-11-23T17:13:45+09:00 Subject: [ruby-list:11021] Re: バックスラッシュのエスケープ 前田です。 >>>>> In [ruby-list:11019] >>>>> "菊谷" == Kikutani Makoto san wrote: 菊谷> Mon, Nov 23, 1998 at 03:44:40AM +0900 において 菊谷> Kikutani Makoto 曰く: >> a = '\\' >> p a => "\\" >> p a.size => 1 菊谷> なんだから、もともと「\」しか入ってない文字列なんですかね。 菊谷> 自分で書いてて前半と後半で理解が違うとは。 たぶん"\\"=>"\\\\"という変換をしたかったのではないでしょうか。 >> > 期待通りに動作させるにはどうすれば良いのでしょうか。 >> >> ということで、'\\\\\\\\' ('\' が8個)と書きましょう (^^; >> >> # 6個でもいいみたい。 菊谷> うーむ、ますますわからなくなってきた。 これは文字列リテラルのエスケープと、さらにgsubのエスケープが 重なってるため、"\\\\"に変換するには"\\\\\\\\"を渡す必要が あるということです。 なぜgsubがこうなっているかというと、gsubは"\\&"をマッチした文字列 に置き換える必要があるため、\を特殊な文字として扱う必要があるから です。 例えば、 p "\\".gsub(/\\/, "\\&\\&") #=> "\\\\" としても"\\"=>"\\\\"の変換ができます。 これがややこしいので、\&などを%&とかに変えた方がよいのではないか という議論が以前ありました。 わけがわからないという人は、 p "\\".gsub(/\\/) { "\\\\" } #=> "\\\\" とイテレータを使うという手もありますね。 -- 前田 修吾 (mailto:shugo@aianet.ne.jp)