[ruby-list:50154] Re: String.deleteでバックスラッシュの削除
From:
MASAKI Yuhsuke <yek@...>
Date:
2015-05-14 12:30:26 UTC
List:
ruby-list #50154
正木です。
RubyとZshにおけるシングルクォート内のバックスラッシュの挙動を誤解していた
(Rubyは'直前以外の、Zshは全てのバックスラッシュをそのままにするのだと理解していた)
のが原因だったようです。お恥ずかしい…
$ print '\(Ruby Users\)'
(Ruby Users)
全くそのとおりでした。
ありがとうございました。
You wrote:
> こんにちは、なかむら(う)です。
>
> In message "[ruby-list:50152] String.deleteでバックスラッシュの削除"
> on Wed, 13 May 2015 20:53:29 +0900, yek@reasonset.net wrote:
> > 文字列中のバックスラッシュを削除しようとして
> >
> > mailobj.list = $1.delete('"\<>/!?')
>
> String#deleteの引数は単にその文字列中の文字を意味するのではな
> くて、- と ^ に特別な意味があり、またこの2文字を普通の文字と
> して扱うために \ にエスケープの意味が与えられています。
> そのため、\ は末尾に置かれた場合以外では \ という文字そのもの
> としては解釈されませんので、2重に重ねる必要があります。
>
> なのですが、
>
> > mailobj.list = $1.delete('"\\<>/!?')
> >
> > でも残り、
>
> ややこしいことに、単に文字列リテラル中に \\ と書いても、それ
> 文字列リテラルのエスケープ表記とみなされて、結局 \ 一文字にな
> ってしまうため、\ と書いても \\ と書いても同じことになります。
> (後続の文字によっては異なることもありますが、とりあえずこの場
> 合はそう)
>
> というわけで、正解は
>
> $1.delete('"\\\\<>/!?')
>
> と書く、ということになります。
>
> もちろん、先に書いたように \ は末尾に置かれた場合はエスケープ
> の意味を失いますので、
>
> > mailobj.list = $1.delete('"<>/!?\\')
>
> も正解です。
>
>
> > にすると消えるのですが、コマンドライン上でシンプルにテストすると
> >
> > print '\(Ruby Users\)' | ruby -e 'p STDIN.read.delete('"'"'\<>/\!?'"')"
> >
> > であっても消えます。
> > これは一体何でしょう??
>
> シェルが食べちゃってますから、単に
>
> print '\(Ruby Users\)'
>
> だけでもう消えてると思いますよ。Rubyは何もしてません。
>
>
> それでは。
******************************
* The Rider, Hacker and Musician.
* +++ ENABLE YOUR HEART +++
******************************
* MASAKI Yuhsuke.
* yek@reasonset.net
* Website: http://reasonset.net/
* GitHub : https://github.com/reasonset/
* Twitter: @reasonset
******************************