「初めてのPerl」: 9章正規表現の利用法
今日は正規表現の最終章である9章を勉強しました。今まで知らなかったことをいっぱい勉強できました。
結合演算子: =~
Perlではじめて「=~」使ったコードを見た時、「+=」と同じような働きをする演算子だと思いました。イコールの後に記号があると、CやJavaの経験があると、ついそう思ってしまいます。それで「=~」を見ると、まだちょっと違和感があります。
全然関係ありませんが、このセクションで「やっつけ仕事的」というフレーズが出てきます。それって英語では「quick-and-dirty」と表現するのですね。前に英語のサイトで「quick-and-dirty」という言葉が出てきて結局何の意味かわからなかったのですが、これでやっとわかりました。昔にalcの英辞郎 on the Webで「quick-and-dirty」を検索しても意味が載っていなかったのに今ではちゃんと出ますね。
マッチ変数の有効期限
マッチ変数(/1, $1)の値は、次にパターンマッチが成功するまで残るという事実をはじめて知りました。「成功するまで」という条件が落とし穴ですね。マッチの結果をテストせずにマッチ変数を使うと、そのマッチ変数は以前にマッチした時の値を保持している可能性があると筆者は教えてくれました。バグの原因になるから気を付けなさいってことですね。
デリミタの変更
m//やs///は見ての通りデフォルトのデリミタは/(スラッシュ)です。これを変更できることをはじめて知りました。確かに本書で挙げられているようにURLのマッチや置換は、デフォルトのデリミタのままではスラッシュの前にバックスラッシュを書かなければならないので面倒です。
m//が「m%foo%」のようにデリミタを変更できることは容易に想像できましたが、s///はどうなるのだろう?と疑問に思いました。その疑問はすぐに解消されました。以下のように対にして書けば良いのですね。納得。
s{fred}{barney}
s[fred](barney)
s#barney#
CSVのパースはsplitを使わずにText::CSVを
split演算子のセクションで、CSV(commma-separated value)ファイルのパース以外の場面でsplit演算子がとても役に立つと書かれていました。Text::CSVモジュールを薦めているようです。
そこでインストールして試してみました。CPANシェルで一瞬でインストールは完了しました。
# perl -MCPAN -e shell cpan> install Text::CSV
最初はsplitでも問題ないのでは?と思っていましたが、Text::CSVのperldocに書いてあるEXAMPLEを見ると、 なぜsplitではだめなのかよくわかります。以下を見て下さい。
my $sample_input_string = '"I said, ""Hi!""",Yes,"",2.34,,"1.09"';
一見するとわかりにくいですが、「'"I said, ""Hi!""",」の「said」の直後にある「,」がくせものです。これがあるためにsplitでは期待通りにパースできません。こんなに複雑だとsplitで分割するのは確かに限界がありますね。納得。
Text::CSVを使えば、このような複雑な文字列も安全にパースしてくれます。
$ perl text.csv.pl 1=>I said, "Hi!" 2=>Yes 3=> 4=>2.34 5=> 6=>1.09
練習問題: perlfunc.podを料理せよ
ターミナルで以下のように入力するとPerlのビルトイン関数のドキュメントが読めます。マニュアルは整形されて見やすく表示されます。
$ perldoc perlfunc
練習問題の2つ目では、このコマンドに「-l」オプションを付けると、ドキュメントがインストールされている位置を取得できると書かれています。そこで以下の要領でperlfunc.podをviで読んでみました。
$ vi `perldoc -l perlfunc`
perldocコマンドが解釈できるような特殊なマークアップがされていることが確認できます。CPANモジュールのドキュメントはpodで書かれるので、将来CPANモジュールを自作できるようになるためにも、podの勉強も必要かな?と思ったのでした。
さりげなくperlfunc.podを材料にして正規表現の勉強をさせるのはナイスな考えですね。