なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

「初めての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時間、という標準ペースに対しては問題なさそうだから、まとまった時間の確保の方が問題。