著作一覧 |
と、タイトルを書いて今気づいたが、?:って「三項演算子」だな。というか別に間違ってはいないか。+は二項演算子だし。単項もあるでよ。なぜ、三項演算子という呼び方を目の敵にする人がいるのだろうか?
そういえば、三項演算子の利用を目の敵にする人もいて、マーティン?ファウラーがネタにしていたくらいだ。(ネタといわず、例としてでも良いけど)
いずれにしても、三項演算子は報われない生涯を歩んでいるようだ。
で、正規表現の?:だが、これは何が嬉しいのだろうか?
と、先日購入したハンドブックを読んでいて、初めて知った(一通りの書き方は目を通していたはずだから初めて知ったはないとは思うので)あるいは意識したのだが、さっぱりわからない。
?:のご利益は後方参照用の保存をしないことだということはわかったのだが。
たとえば、/(?:abc)(def)/ =~ "abcdef" として、$1でabcの代わりにdefが取れるというのは例としてはひどいので、たとえば、/(?:(abc)|(def))gh/ =~ "abcdefgh" とすると、外側の()には?:が付いているので、$1はnil、$2はdefとなる。というのは、ghが後ろに続いているのはdefのほうだし、/(?:(abc)|(def))gh/ =~ "abcghdef" なら、$1がabcで$2がnilだ。
たとえば、続けて unless $1 …… みたいな書き方をしたければ、こう書けば良いし、どちらか読めたほうが欲しければ/(abc|def)gh/ として、if $1 == "abc" と書けば良いのだが、別に、/((abc)|(def))gh/ と書いても何も困らないし、むしろ余分な2文字を打たなくて済むから、こっちのほうが良いようにさえ感じる。
たとえば$xのxが1〜9までしか使えず、かつ()を30個くらい書かなければならないような正規表現なら、?:で抑制するのは必要になるわけだから、なくては困るというのはわかる。
でも、そうでなければ、どのような時に?:という余分な2文字をわざわざ記述する正当な理由があるのだろうか?
正規表現ハンドブック (Technical Handbook Series)(和郎, 鹿島)
というわけで、たまたま?:のところを読んで疑問に感じた。
それはそれとして、それぞれについて例が出ているし、言語ごとの異動なども書かれているので、結構、お得感がある本で買って正解だったようだ。サイズもいい感じだし。
追記:木村さんの?:の使い方の説明。ありがとうございます。
こんな感じの使い方ができるということかな。
def cstr(match); "#{$1}-{$2}";end;
というようなメソッドがあって、でも与えたいMatchDataに対する正規表現は複数パターンがあって、しかもグルーピングがそれぞれ異なる可能性がある。でも、cstrメソッドが処理対象にするのは$1と$2だから、もし/(aaa)(bbb)(ccc)(ddd)/
みたいな正規表現が必要で、かつcstrの処理対象にしたいグループが3〜4番目なら/(?:aaa)(?:bbb)(ccc)(ddd)/
とすれば良い、ということ。なるほど、これはありそうな気がします。
それはそれとして、?:を、クロイスター(むしろクロワトルというほうが雰囲気がいい)と読むというのがちょっと意表をつかれた。でも単にクラスターの洒落なんじゃないかなぁ。
さらに追記:なんか寝ぼけたことを書いたようだが木村さんの例は、正規表現に正規表現を埋め込んで使えるようにできるということだった。
げげげ、こんなの出てるのか。
ヴィジュアル・ヒストリー 1972-1982 [DVD](ロキシー・ミュージック)
忘れずにあとで買う。
ヴァージニアプレインも入っているから、きっとケバくてヤバいイーノも観られるだろう。
追記:買った。
ジェズイットを見習え |