続・初めてのPerl 改訂版

「初めてのPerl」の次に読む本という位置づけになっています。


初めてのPerlについては、「http://d.hatena.ne.jp/koba04/20100105/1262700048


これ、本当に素晴らしくて、Perlを学ぶ際には避けて通れない一冊だと思います。


「初めてのPerl」くらいの内容は理解している前提で進められ、内容は大まかに以下のような感じです。

  1. リファレンスやリストなど様々なデータの扱い方(サブルーチンのリファレンス、grep、map、Data::Dumper、YAMLなど)
  2. オブジェクト指向
  3. packageやuse、requireなどの使い方
  4. ディストリビューションの作り方(h2xsなど)
  5. テスト、テスト、テスト!
  6. CPANについて


以下、章ごとに感想を。

1章 イントロダクション

  1. まぁよくある「はじめに」ですね。それによると本書は「100行〜10000行」程度のプログラムを書く際に必要となることが書かれているそうです。
  2. 個人的にこういう技術書の最初にあるような「はじめに」を読むのが好きです。

2章 中級者の基礎知識

  1. リストに対してgrepやmapを使う際の注意点やevalの使い方が載っていたりと、短い章ですが役に立つ情報が詰まっている章です。(grepの引数にブロックを使うときはreturnをつけない、evalは極力使わないなど)

3章 モジュールの使い方

  1. CPANにあるモジュールをどうやって使うかという内容の章です。
  2. CPANにあるモジュールを使う上で必須の情報がわかりやすくコンパクトに書かれており、CPANの第一歩という感じの章です。

4章 リファレンス入門

  1. リファレンスとは?という章です。
  2. リファレンスに関する基本的なところを整理できるわかりやすい章だと思います。
  3. 練習問題にあったのですが、同じデータに対する参照でも「->」があったりなかったりなど色々な書き方が出来る点は、わかりにくいと言われる一つの要素だろうなと思いました。
$ref->[2]->[1]->[0]${${${$ref}[2]}[1]}[0]
と一緒。
  1. これ全部同じ参照先なんですよね、、自分は2番目の「$ref->[2]->[1]」と書きます。
$ref->[2][1]
$ref->[2]->[1]
${$ref->[2]}[1]
  1. あと、ハッシュスライスも使っていきたいなと思いました。

5章 リファレンスとスコープ

  1. この章は、無名配列や無名ハッシュ、変数のスコープについての章です。
  2. 変数の参照カウントについては、「変数のスコープは極力狭くすること」を意識するくらいで、意識的に考えてなかったので参考になりました。
  3. 無名配列や無名ハッシュは本当に便利なので、この章はPerlを便利に使う第一歩という気がします。
  4. 「+{key => "value"}」のように無名ハッシュを明示的に示す時に使うプラス記号は、こんな感じ「%{+shift}」で関数の引数を取得するshiftに付けられているのが多い気がします。(この場合はハッシュリファレンスが渡されている)
    1. これ、最初見たときプラス??足してるの?と思いました・・・

6章 複雑なデータ構造の操作

  1. ここでは、「perl -d」を使ったデバッグの方法や、Data::Dumper、YAML、Storableの使い方、複雑な構造のデータをmapやgrepを使い処理していく方法なんかについて書かれています。
  2. Data::Dumperなんかはデバッグには必須ですし、YAMLは設定ファイルなんかに使われたりしていますし、Storableはオブジェクトを永続化したい際に使われたりと役に立つ情報が詰まった章だと思います。
  3. またこれ以前の章でもよく出てくるmapとgrepですが、個人的にはこの二つの関数が使えるようになってからPerlが楽しくなってきました。この本のmapとgrepやリファレンスあたりの内容は本当に素晴らしいと思います。

7章 サブルーチンのリファレンス

  1. サブルーチンの活用法についての章で、サブルーチンのリファレンスの渡し方などから、コールバック関数、クロージャまで取り上げられています。
  2. サブルーチンのリファレンスを使用する機会としては、File::Findのfind関数でディレクトリ以下のファイルを再帰的に処理する場合がよくあるかと思います。例としてそのFile::Findでの使い方が紹介されているのもいいですね。
  3. また、コールバック関数やクロージャの使い方なんかも紹介されています。この辺りはなんとなくしか理解出来ていなくて使いこなせていないので、ちゃんと使いこなせるまで理解したいなと思いました。

8章 ファイルハンドルのリファレンス

  1. ここでは、ファイルを扱う際の注意点と様々なモジュールの紹介がされています。
  2. ファイルやディレクトリを扱う方法は、バグを埋め込まないためやセキュリティの対策としてしっかり覚えておきたいところですね。

9章 リファレンスを使った実践的なテクニック

  1. ここでは、ソート処理についてや再帰的な処理についてなど、ここでもデータの加工処理について書かれています。mapやgrepとともに使いこなしたいところですね。
  2. シュワルツ変換についてはこちらでも書きました。
    1. http://d.hatena.ne.jp/koba04/20100131/1264915581
  3. 再帰的な処理についてのコードは、読んでいていい頭の体操になりました。

10章 大規模なプログラムの構築

  1. ここではモジュールやクラスを作るための準備として、「do」、「require」、「@INC」、「use lib」や「package」などについてまとめられています。
  2. この辺りの知識も曖昧なところがあったので整理できてよかったです。

11章 オブジェクト入門

  1. Perlでのオブジェクトの作り方について説明されています。Javaなどと比較するとむき出しっぽい感じがあって、独特な感じがありますので、こうやって丁寧に説明されているのは知識を整理する意味でもありがたいですね。
  2. メソッドの作り方やオーバーライドの方法について書かれています。

12章 データのあるオブジェクト

  1. 11章からの流れで、ここではメンバのあるクラスの扱い方についてわかりやすく書かれています。
  2. 最初ネットなどでPerlでのクラスの作り方を見たときに、blessしてというのがイマイチしっくりこないままこういうもんだと思って書いていたので、最初にこの説明を読みたかったと思いました。
  3. よくあるコンストラクタの作り方
sub new {
    my $class = shift;
    $data = {
            name => "koba04",
            age  => 28,
        };
    return $data, $class;
}

13章 オブジェクトのデストラクション

  1. ここでは、デストラクタ(DESTROY)についてや間接オブジェクト記法、クラス変数やリファレンスの弱め方について書かれています。
  2. DESTROYについては、頻繁に使うことはないと思いますが、覚えておくと便利だと思います。
  3. 間接オブジェクト記法については、Javaエンジニアの人がPerlで書く際に使っていたのを見たことがあります。自分は「->」が好きなので使いませんでしたが。あとこの章でprintやopen関数がこれを利用していたのかとわかってよかったです。
print FH "test";
open my $fh, '>', $file_name;
  1. ところで、ここで紹介されていた参照カウントをプラスされなくする「weaken」ってよく使われているのでしょうか??イマイチ使いどころが思い当たらなかったので。。

14章 オブジェクトに関する高度なトピック

  1. ここではUNIVERSALやAUTOLOADなど、Perlの黒魔術的な関数の使い方や、その他ゲッター/セッターや多重継承について書かれています。
  2. UNIVERSALやAUTOLOADは、フレームワークを書いたりなど高度なコーディングをするとき以外はあまり使わないような気もしますが、CPANにあるようなモジュールのコードを読むときにはその知識が必要になるかと思います。(知っていないとどこで何が呼ばれているのかわからず行方不明になってしまいますので。。)

15章 Exporter

  1. タイトル通り、Exporterモジュールの使い方や「use」についての章です。
  2. Exporterは正直イマイチ理解出来ていない部分もあったので、ここで詳細に説明されていてようやく理解することが出来ました。「@EXPORTER」と「@EXPORT_OK」と「%EXPORT_TAGS」も理解出来ました。

16章 ディストリビューションの書き方

  1. 個人的にこの章はすごく勉強になりました。
  2. h2xsなどでのディストリビューションの作り方で、MANIFESTやMakefile.PLなどのファイルの意味もそれぞれ説明されています。
  3. モジュールの作り方を見ることでCPANにあるモジュールを見ても理解しやすくなりました。また自分でも作ってみようと思うようになりましたし、作るだけの知識は得られたなと思いました。
  4. 下記のようなコマンドの意味がわかるようになります。
・h2xs -Xan Sample
・perl Makefile.PL PREFIX=...
・make test
・make install
・make dist

17章 基本的なテスト

  1. ここでは、Perlにおけるテストに対する考え方や、Test::Moreの使い方について説明されています。
  2. それにしても18章も含め、テストに対して2つの章を費やしていることが、Perlがテストを重要視していることを示している気がしました。

18章 高度なテスト

  1. ファイルや標準出力に対するテスト、モックオブジェクトを使ったテスト、PODに対するテスト、カバレッジテストなどから独自のTest::*モジュールの作り方まで説明されています。
  2. 今はあまりTest::*モジュールをうまく活用できていないので、ここで紹介されているようなものをはじめ、うまく使いこなしていきたいなと思いました。
  3. それと同時にシンプルにテストを書けるようにモジュールを作るということって大事だなと思いました。

19章 CPANへの投稿

  1. ここでは、CPANの世界に入っていくための方法が書かれています。これからの夢が広がる章です。まずはgithubに公開していくことからかな。

まとめ

  1. 長々と書きましたが、言いたいことはひとつ。
    1. オススメです!!
  2. 「続」とついているために、もしかすると飛ばしてしまいそうになるかもしれませんが、これは本当にいい本だと思います。
  3. 「初めてのPerl」がPerlについての説明だとしたら、本書はPerlPerlらしく楽しく使うための本だと思います。
  4. この本を読んでからさらにPerlでコードを書くのが楽しくなりました。