「初めてのPerl」を読んでいて、「へぇ」だったこと。その3
注意:「初めてのPerl」を読んでいて、「へぇ」だったこと。その2 - なからなLifeの続きです。
正規表現は本格的に勉強したことがないので、他の言語、他の環境でもサポートされている内容が含まれるのだろうけど、とにかくとにかく「へぇ」と思ったことは書こうと思います。
7章 正規表現の基本
とにかく強力。
つか、この強力な機能を使いこなすには、文字通り「身体に染みこませる」ことが必要だなと。
記法については、ここでまとめるより、どこかのサイトのチートシート探してきたほうがよいでしょう。
自分でまとめたほうが勉強にはなるんだがな。
あとはひたすら経験あるのみ、というところだな。
そこまで使い込むか解らんけど、正規表現そのものは知っているのと知らないのとでは大違い。
練習問題4
wilmaを含むすべての入力行を表示。かつ、wilmaもWilmaも表示する。
while(<>){ if(/(w|W)ilma/){ print; } }
デフォルトの$_すら記入しない、暗黙のデフォルトの多用。
Perlはデフォルトは積極活用することでタイプ量を減らすカルチャー。
他の言語やってると、「暗黙は明示して可読性を」のカルチャーの方が多いと思う。
これ、いいのかなあ。というところは突っ込まず、とにかくそういう文化があるのだということを認識しておく。
あくまで、「書く人としてのPerl学習ではなく、仕様を伝える人、時折ソースを読むとしてのPerl学習」である目的を忘れない。
8章 正規表現の詳細
色々あるなあ。
\w:ワード \s:スペース \d:数字
それぞれ大文字でその否定。
[]で、カッコの中に書いたもの、となるものを、頻出するものはひたすらショートカット化してタイプ量を下げる、と。
{n}で出現回数を指定できる。 {n,m}で、任意の文字列をn〜m回繰り返しm省略は無限。 *は{0,} +は{1,} ?は{0,1}
と。まあよく出来ているなあ。
アンカーもまた複雑。
^:先頭 $:末尾 \b:中間
ただしbは区切りタイミングが難しいので気をつけろ、と。
カッコによって記憶する!?
後方参照に使うようだが、理解度かなり浅い。
/((fred | wilma) (firestone)) \1/ #fred firestone fred filestoneにマッチ /((fred | wilma) (firestone)) \2/ #fred firestone fredにマッチ /((fred | wilma) (firestone)) \3/ #fred firestone firestoneにマッチ
うーん。
メモリ1:fred firestone
メモリ2:fred または wilma (なので、fred firestone wilmaのような文字列はアンマッチ)
メモリ3:firestone
と記憶される、という理解でよいのかな。
9章 正規表現の利用法
オプション色々。まあそりゃないと困るわな、というもの。ここでは軽くしか触れてない。
結合演算子「=~」。
やっと出てきたか。デフォルト「$_」以外の変数に格納されている文字列に対するマッチング。
マッチ変数。
「へぇ」というよりは、「ふーん」という感じ。(その違いはなんだ?)
驚きとかじゃなく、とにかく覚えましょってレベル。
正規表現を多用する言語をやったことがないから、さらにその正規表現機能に対する言語的な工夫をされても、「へぇ」とも言えない。
$1,$2,$3:「完了したパターンマッチ」の後方参照 /1,/2,/3:「現在行っている正規表現メモリの後方参照」
自動マッチ変数
$&:マッチした部分すべて $`:マッチした部分より前の要素 $':マッチしなかった残りの要素 $`$&$':マッチした行すべて
便利だが、いずれかを使っていると処理速度が遅くなるので、あまり使わない。
パターン全体を()で囲んで、$1を取れば、$&の代わりになる?
splitとjoin
1行の文字列を分解して配列的なものにしてループさせつつ扱いたいときは良くある。
配列的なもの(カーソルなんか)をループさせて1本の文字列にしたいことは良くある。
とくに、非正規化を多用したDBの中身をいじるバッチなんかでは良くある話。
それがsplitとjoinでやっつけられるのかな、と。
練習問題2がまったく意味不明。(設問の日本語が理解できず)
回答を見て、ようやく何をさせたいか意味が解った。
うう。むづかすぃ。
とりあえず、第9章まで終了。正規表現はここまで。
このペースだと、今週中に17章まで終わんないよう。
ここまでかけた時間、たぶん12時間くらい。
30〜45時間、という標準ペースに対しては問題なさそうだから、まとまった時間の確保の方が問題。