Shibuya Perl Mongersテクニカルトーク#16で配られたうちわの解説

やっておりますShibuya.pm。今回のテーマは「夏の正規表現祭り」。会場はmixiさんでした。会場に着き、席に着くとmixiさんのノベルティがずらり。その中にmixiさん特製のうちわがあり、そこには、「ん?なんだかPerlっぽいぞ」という感じのコードが書かれていました。話によると、「夏の正規表現祭りだから正規表現っぽいコードをプリントしてあります」とのこと。

$_ = q.
socierviceal
ocialg
service
.;

s.ocial.networkin.g;s.ervice

..mixi;

print;

ためしにその場でエディタに打ち込んで実行してみると、以下のような文字列が出力されました。

social
networking
service

おおー。というわけで、このコード、上から読んでみました。式をひとつひとつ追っていくとそんなに変なことはやっていないのがわかると思います。

$_ = q.
socierviceal
ocialg
service
.;

はい、これは簡単ですね。perlでは q/string/ は 'string' と等価です。変数展開したい場合は qq/$string/ でおk。この、文字列を作る際に使うqとかqqは区切り文字(?)に任意の文字いろんな区切り文字を使えるので、 q/hogheoge/ は q{hogehoge} と書くこともできます。また、q astringaのようにqのあとに一文字スペースを入れると、区切り文字に任意の文字を使えます。というわけで、ひとつめの式は、 q.. で囲まれた文字列を特殊変数$_に代入していることになります。(はてブで間違いを指摘してもらいました。id:kitsさんありがとうございます)

で、次。

s.ocial.networkin.g;s.ervice

..mixi;

少し読みにくいので、整形します。

s.ocial.networkin.g;

s.ervice

..mixi;

ピン!と来てる人も多いと思いますが、さきほどはq//のトリックを使っていますが、今度はs///のトリックを使っています。置換に使う正規表現のs///も、文字列生成に使うq//と同じく、区切り文字(?)に任意の文字を使うことができます。というわけで、冒頭のコードを読みやすく整形したコードを下記に示します。

#文字列を作る
$_ = q/
socierviceal
ocialg
service
/; 

# $_の中の「ocial」を全て「networking」に置き換え(gオプション)
s/ocial/networkin/g; 

# 文字列を複数行として扱い(m)拡張正規表現を使用し(x)大文字小文字を無視して(i)、
# 「ervice」を一度だけ(gなし)空文字列に書き換える
s/ervice

//mixi;

print;

ということでした。おしまい。