//

一番短い正規表現、 // の話をします。 // は何か知ってますか。何にでもマッチする正規表現です。以下の Ruby だか Perl だかわからんプログラムは、Ruby でも Perl でも、 $_ がどんな文字列でも 1 と表示するはずです。

print (//?1:0)

ところが Ruby では $_ は文字列以外になりえます。よって結構 0 と表示されるシーンも多かったりします。ゴルフで gets のお供に使えるシーンもあったりするかもしれません。

さて、 // はどんなものにもマッチしますが、文字列中のどの文字ともマッチしてないはずです。つまり、以下の Perl とも Ruby ともわからないコードは Perl でも Ruby でも何も出力しません。 ($& はマッチした文字列が入る組み込み変数)

"x"=~//;
print $&;

ところが Perl はよくわかりません。

"a"=~/./;
"x"=~//;
print $&;

このコード、 Ruby では何も出力されないのですが、 Perl だと x と出力されるのです…ちなみに、

"a"=~/../;
"x"=~//;
print $&;

は何も出力されず、

"aa"=~/../;
"x"=~//;
print $&;

は "aa" と出力され、

"aa"=~/../;
"xx"=~//;
print $&;

は "xx" と出力されます。 Ruby は何も出力されないのに!さすが Perl です!

いやさすがにバグなんじゃないかとは思うのですが。手元の Perl のバージョンは 5.8.8 です。

追記: コメントでもいただきましたが全然バグじゃ無いよ無知なおばかさん!とのこと。きむらさんに詳しく解説していただきました。

http://www.kt.rim.or.jp/~kbk/zakkicho/07/zakkicho0701.html#D20070119-6

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h