あなたがブログで勉強日記をつけるべき6つの理由
正規表現はほんの基礎しか解説しないつもりだったのに、ここ数日どんどん解説してしまいます。(笑)
でも、他の人にわかるように書く事で、自分の理解が深まる気がします。こういったブログのようなパブリックなスペースでは、常に人の目を意識しなくてはいけないので、自然と「どう書けばわかりやすいかな」と考えるようになってきました。
わざわざ正規表現を解説してしまうのも、「このパターンがわからないと、このプログラムは理解してもらえないよなぁ……」と考えてしまうからです。
という文章を書いていたら、勉強日記の先輩である id:rubyco さんこと結城浩さんが、同じことを書いていました。(^_^;)
どうやら、ブログで勉強日記を付けると、そういう効果があるようですね。そこで、勉強日記をブログでつけるメリットをまとめてみました。
題して「あなたがブログで勉強日記をつけるべき6つの理由」。この6つの理由が、あなたを動かすきっかけになれば幸いです。(^_^)
- 自分の勉強の記録が残せる。
- 「ああ、自分はこんなに勉強したんだな」と実感できる。
- ブログなのでネットを通じてどこからでも参照できる。
- 検索も簡単にできる。
- 時系列や、タグによる分類など、整理整頓もしてくれる。
- ノートと鉛筆じゃこうはいかない。
- 人の目を意識する事で、自然と理解が深まる。
- 物事を人にわかりやすく書くには、まず自分自身がその物事を良く理解する必要がある。
- ブログのような公共の場では、読んでいる人に理解してもらえなければ意味がない。
- つまり、ブログだとそれが自然とできる。
- 勉強する気になる。
- 日記をつける感覚で勉強できる。
- ネットがあれば、どこでも勉強できる。
- コメントやトラックバックをもらうと、やる気がでる。
- 理解が間違っているとツッコんでもらえる(と期待できる)。
- ツッコんでもらえれば正しい理解が得られる。
- もちろんツッコミがもらえるとは限らないので、なるべく自力で正しく理解するよう努力する事。
- その分野に興味がある人と交流できる。
- なにより楽しい。
- 1人で勉強するより、みんなで勉強する方が楽しい。
- 1人で黙々と本を読むより、みんなで読んだ知識を共有した方が楽しい。
- 1人で鉛筆を動かすより、みんなに向けて文章を書く方が楽しい。
そうなんです。楽しいんですよね。ブログで勉強日記。
もし、あなたが何か新しい勉強を始めようとしているなら――プログラミング言語でもいいし、何か難しい本にチャレンジしたり、学校の授業の復習でもいいでしょう――ブログで勉強日記を付けるのがオススメです。
きっと、素敵な勉強日記になると思います。
追記(2006/05/25)
正規表現(5) キャプチャ
正規表現の中でカッコ ( ) を使うと、マッチした文字列の一部をキャプチャ(捕獲)して後で使う事ができます。これは、正規表現を使う上でとっても重要なテクニックです。
例えば
m/aaa(bbb)ccc/
というパターンがあるとします。この検索パターンは「aaabbbccc」という文字列にマッチします。カッコは特殊な文字なので、検索する時は無いモノとして扱われるのです。つまり「aaa(bbb)ccc」という文字列にはマッチしません。*1
"aaabbbccc" =~ m/aaa(bbb)ccc/; # 真:マッチする
"aaa(bbb)ccc" =~ m/aaa(bbb)ccc/; # 偽:マッチしない
このパターンの場合、「bbb」をキャプチャしている事になります。キャプチャした文字列は左のカッコから順番に $1、$2、$3、$4… という連番の変数に入ります。
例えば、以下の場合
"abcdef" =~ m/a(b)c(d(e)f)/; # マッチする
print "$1\n$2\n$3\n";
実行すると
b def e
と表示されます。$1に「b」が、$2に「def」が、$3に「e」が入っていますね。(^_^)
このキャプチャを利用すると、substr 関数などを使わなくても、簡単に文字列の一部を取り出す事ができます。(ただし、「パターン」を見つける必要があります)
例えば、Windows の設定ファイルの一種として INI ファイルというものがありますが、一行が「名前=値」という書式になっています。*2
この1行を取り出したとして、ここから名前と値を取り出したいとすると
use strict;
my $line = "Food=Apple"; # INIファイルから取り出した1行
if ($line =~ m/([^=]+)=(.+)/) {
print "Name : $1\n";
print "Value: $2\n";
}
のようになります。
実行結果は以下の通り。
Name : Food Value: Apple
とっても楽チンですね。(^_^)
使用した正規表現
m/([^=]+)=(.+)/
について詳しく説明すると、まず1つめのカッコ($1)が名前にあたり、「=」をはさんで、2つめのカッコ($2)が値にあたります。
「[^=]+」は、「= 以外の文字列」にマッチします。「[^=]」は「= 以外の何か1文字」、「+」は「直前の文字が、1個以上連続する」という意味ですから、「=」までの文字列(Food)にマッチします。(^_^)
「.」(ドット)は、「改行以外の何か1文字」にマッチします。「+」を付ける事で末尾までの文字列を取得しています。
「+」(1文字以上)、「*」(0文字以上連続)、「?」(0文字または1文字)のような「文字の連続量を表す」特殊文字の事を「量指定子」と呼びます。量指定子を使った正規表現は、できるだけ「長く」マッチしようとします。あればあるだけ飲み込んでしまう「欲張り」なマッチです。(^_^;)
これを「できるだけ短く」にするには、量指定子の後ろに「?」を付ければ良いそうです。
use strict;
"aaabbbaaabbbaaabbb" =~ m/.+b/;
print "$&\n"; # $& はマッチした文字列全体
"aaabbbaaabbbaaabbb" =~ m/.+?b/;
print "$&\n";
前者のパターンでは、「+」なのでできるだけ長くマッチします。後者は「+?」なのでできるだけ短くマッチします。
実行結果は以下の通り。
aaabbbaaabbbaaabbb aaab
正規表現を使うと、文字列処理がとても簡単ですね。正規表現が無いプログラミング言語ではこうはいきません。
「名前=値」を扱うにも、まず「=」の位置を探して…「=」の前までの文字列を切り出して…「=」の後ろから末尾までの長さを求めて…「=」の後ろの文字列を切り出して…大変です。(^_^;
正規表現は工夫しだいで色々な事に使えそうですね♪