本日購入したPerlの本

Amazonポイントが5000円分残っていたのでPerlの本に全部突っ込んでみた

モダンPerl入門

モダンPerl入門 (CodeZine BOOKS)

モダンPerl入門 (CodeZine BOOKS)

プログラミングPerl

プログラミングPerl〈VOLUME1〉

プログラミングPerl〈VOLUME1〉

Perl徹底攻略

Perl徹底攻略 (WEB+DB PRESS plus)

Perl徹底攻略 (WEB+DB PRESS plus)

Perlプログラミング救命病棟 (Programmer’s foundations)

Perlプログラミング救命病棟 (Programmer’s foundations)

Perlプログラミング救命病棟 (Programmer’s foundations)

Perlデバッグ

Perlデバッグ

Perlデバッグ

  • 作者: ピータースコット,エドライト,Peter Scott,Ed Wright,スリーエーシステムズ
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2001/12
  • メディア: 単行本
  • この商品を含むブログ (2件) を見る

感想とメモ - すぐわかるオブジェクト指向Perlの第五章を読んだ

  1. すぐわかるオブジェクト指向Perlの第一章を読んだ
  2. すぐわかるオブジェクト指向Perlの第二章を読んだ
  3. すぐわかるオブジェクト指向Perlの第三章を読んだ
  4. すぐわかるオブジェクト指向Perlの第四章を読んだ
  5. すぐわかるオブジェクト指向Perlの第五章を読んだ←今ココ

感想

この章ではサブルーチンのリファレンスを扱います。前回の章と同じく三章でリファレンスの基礎がガッチリと固められているので、リファレンスについて多く語られることはないです。

メモ

この章で学べること一覧

・サブルーチンの復習
・サブルーチンのリファレンス
・無名サブルーチン
・サブルーチン リファレンスの応用
・ハッシュにサブルーチン リファレンスを収納する

普通のサブルーチン

my $sub_result = &tashizan(1,2,3);
print $sub_result;

sub tashizan {
  my ($one, $two, $three) = @_;
  my $result = $one + $two + $three;
  return $result;
}

本書では以下のように説明されている

sub サブルーチン名 {
...
}

サブルーチンをこのように定義して

$戻り値 = &サブルーチン名(引数1, 引数2, ...);

&をつけて呼び出す。


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

$codeRef = \&tashizan;
$sub_result = &$codeRef(1,2,3);
print $sub_result;

sub tashizan {
  my ($one, $two, $three) = @_;
  my $result = $one + $two + $three;
  return $result;
}

サブルーチンのリファレンスは「&」で取得できます。それを「&$」でデリファレンスし、リファレンスのサブルーチンを利用できます。サブルーチンをデリファレンスした瞬間にサブルーチンは実行されます。


サブルーチンの矢印記法

$codeRef = \&tashizan;
$sub_result = $codeRef->(1,2,3);
print $sub_result;

sub tashizan {
  my ($one, $two, $three) = @_;
  my $result = $one + $two + $three;
  return $result;
}

前回の&$codeRef(1,2,3)が$codeRef->(1,2,3)に変化しました。これをサブルーチンの矢印記法といいます。


無名サブルーチン

$codeRef = sub {
  my ($one, $two, $three) = @_;
  my $result = $one + $two+ $three;
  return $result;
};

$sub_result = $codeRef->(1, 2, 3);
print $sub_result;

無名サブルーチンはリファレンスを返します。つまり$codeRefはサブルーチンのリファレンスということになります。なので$codeRef->(1, 2, 3)と矢印記法を使ってデリファレンスしてサブルーチンにアクセスすることができます。

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl

感想とメモ - すぐわかるオブジェクト指向Perlの第四章を読んだ

  1. すぐわかるオブジェクト指向Perlの第一章を読んだ
  2. すぐわかるオブジェクト指向Perlの第二章を読んだ
  3. すぐわかるオブジェクト指向Perlの第三章を読んだ
  4. すぐわかるオブジェクト指向Perlの第四章を読んだ←今ココ
  5. すぐわかるオブジェクト指向Perlの第五章を読んだ

感想

第四章はハッシュ(%)のリファレンスです。前回の第三章でリファレンスの基礎をガッチリと学んでいるので、ハッシュのリファレンスはゆるい感じで説明されています。

メモ

この章で学べること一覧

・ハッシュの復習
・ハッシュ スライス
・delete関数
・ハッシュ リファレンス
・無名ハッシュ
・ハッシュ リファレンスによるハッシュ スライスのアクセス
・2次元ハッシュ
・ちょっと横道:プログラムの勉強に便利な__DATA__
・2次元ハッシュプログラムの解説

普通のハッシュ

%hash = ('a',1,'b',2,'c',3);
print $hash{'a'};

Perlのハッシュは配列と同じように「,」で区切って作ることが出来ます。しかしこれだと感覚的にわかりづらいので次のように書けます。

%hash = (
    'a',   => 1,
    'b',   => 2,
    'c',   => 3,
);
print $hash{'a'};

先程は「,」で区切っていたのを「=>」に変更しました。カンマの代わりに矢印を使っていいことになっています。


ハッシュのリファレンス

%hash = (
    "a", => 1,
    "b", => 2,
    "c", => 3,
);

$refhash = \%hash;
print $$refhash{"a"};
print $refhash->{"a"};

ここでのリファレンスにアクセスする方法は二章の配列に似ています。分からない人は2章をしっかりと学んでいけばいいと思います。


無名ハッシュ

$refhash = {
    "a",    => 1,
    "b",    => 2,
    "c",    => 3,
};

print $$refhash{"a"};
print $refhash->{"a"};

先ほどのハッシュリファレンスと無名ハッシュを比べてみると、無名ハッシュのほうが少しだけコンパクトになっていると思います。データを表現する%hashがなくなり、$refhashとなっています。それにより下の処理がコンパクトにまとまっています。

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl

感想とメモ - すぐわかるオブジェクト指向Perlの第三章を読んだ

  1. すぐわかるオブジェクト指向Perlの第一章を読んだ
  2. すぐわかるオブジェクト指向Perlの第二章を読んだ
  3. すぐわかるオブジェクト指向Perlの第三章を読んだ←今ココ
  4. すぐわかるオブジェクト指向Perlの第四章を読んだ
  5. すぐわかるオブジェクト指向Perlの第五章を読んだ

感想

配列のリファレンスは少し複雑です。スカラー変数だけ使って、リファレンスを理解していくのとはワケが違います。配列のリファレンスで心がポキりと折れてしまう人も多いんじゃないかと思います。すぐわかるオブジェクト指向Perlでは、配列のリファレンスについてやはり具体的に説明してます。コンピュータが具体的にどのようにリファレンスを処理しているか、一行一行追って説明してくれます。その他にも配列リファレンスのパターンを一つだけではなく、複数のパターンを用意して解説を加えてます。何度も繰り返し読んでいきたい章です。

メモ

この章で学べること一覧

・配列の復習
・配列リファレンスの取得とデリファレンス
・2つ以上の配列をサブルーチンに渡す
・リファレンスが指す配列の各要素へのアクセス
・$$refMonth[4]ってわかりにくくないですか
・矢印記法
・二次元配列
・自動生成の威力
・シンタックシュガーが利かない場合
・無名配列
・リストの最後に余計なカンマ
・無名配列を使おう
・ブラケットのネスティング
・二次元配列の2つの表現

普通の配列

  • 配列はパレーン()で囲んだもの
  • ブラケット[]を使って配列にアクセスをする
@array = ('a', 'b', 'c');

print $array[1];

配列のリファレンスから配列全体にアクセス

  • 配列のリファレンスはスカラー($)
    • $ref_array = \@array;
  • リファレンスをデリファレンスして、配列の全体を取ってくる
    • @$ref_array
@array = ('a', 'b', 'c');

$ref_array = \@array;

print @$ref_array

配列のリファレンスから配列の各要素にアクセス

  • @$ではなく$$でアクセスしている
@array = ('a','b','c');

$ref_array = \@array;

print $$ref_array[1];

矢印記法を本書では以下のように説明しています。

$$ リファレンス変数名[インデックス]

という書き方は

$リファレンス変数->[インデックス]

という書き方で置き換えれます。
  • 矢印記法で置き換え
    • $$ref_array[1]を$ref_array->[4]にした
    • $$ref_array[1]は配列のリファレンスから配列の各要素にアクセスすることができる
@array = ('a', 'b', 'c');

$ref_array = \@array;

print $ref_array->[4];

$$array[1]と${$array[1]}は違う

  • $$array[1]は配列のリファレンスをデリファレンスしたものにしたいして[1]にアクセスしている
  • ${$array[1]}は配列の第2要素に入ったリファレンスをデリファレンスしている。
@array = ('a','b','c');

$ref_array = \@array;

print $$ref_array[1];
$a = 'a';

$b = 'b';

$c = 'c';

@array = (\$a, \$b, \$c);

print ${$array[1]};

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl

感想とメモ - すぐわかるオブジェクト指向Perlの第二章を読んだ

  1. すぐわかるオブジェクト指向Perlの第一章を読んだ
  2. すぐわかるオブジェクト指向Perlの第二章を読んだ←今ココ
  3. すぐわかるオブジェクト指向Perlの第三章を読んだ
  4. すぐわかるオブジェクト指向Perlの第四章を読んだ
  5. すぐわかるオブジェクト指向Perlの第五章を読んだ

感想

二章では参照について学ぶことになります。Perlの参照とはリファレンスのことです。Perlを始めたはいいけどリファレンスがなあ・・・と思っている人にはこの章から始めたら良いと思います。Perlの参照とはなんぞやということを$(スカラー変数)を利用してとことん。超具体的に、そして、ユーモアあふれたフレンドリーな文章で説明しています。リファレンスが苦手と思う人でも、この第二章なら、いっきに読んでしまうことが可能です。

メモ

この章で学べること一覧

・リファレンスとは何か
・リファレンスのデリファレンス
・デバッガーを使ったプログラムのステップ実行
・名もないスカラー〜無名スカラー リファレンス〜

リファレンスを使った加算プログラム

$age = 14;

$refAge = \$age;

$deref = $$refAge;

++$$refAge

$$refAgeは$ageのデータを見ているので、++$$refAgeをすると、$ageに1加算される。$derefは$ageのデータを渡しているだけ。なので、$ageは15になり、$derefは14となる。

f:id:start162432:20151221202738p:plain


用語

  • リファレンス
    • データを指すデータ
    • \を使うとデータを指すデータが手に入る
      • $xのリファレンスは\$xで手に入る
  • デバック文字列
    • リファレンス変数をprintすると得られる文字列
      • SCALAR(0x1824408c)
  • デリファレンス
    • リファレンスが指すデータを調べること
    • $$で調べることができる
      • $xのリファレンス変数$ref_xを$$で、デリファレンスすると$xのデータが手に入る
  • リファレント
    • リファレンスが指し示すデータのこと
  • 無名スカラーリファレンス

Perlバッカーを使うには#! /bin/perlの次に-dをつけるとデバッカーが起動する。#! /bin/perl -dのようにする。 sでステップ実行、xで式を評価、qでデバック終了


ref関数。Perlは「ある変数がリファレンスかどうか」を知っている。それを調べる関数。リファレント変数$ref_xを調べると、SCALARと文字列が返ってくる。

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl

感想とメモ - すぐわかるオブジェクト指向Perlの第一章を読んだ

  1. すぐわかるオブジェクト指向Perlの第一章を読んだ←今ココ
  2. すぐわかるオブジェクト指向Perlの第二章を読んだ
  3. すぐわかるオブジェクト指向Perlの第三章を読んだ
  4. すぐわかるオブジェクト指向Perlの第四章を読んだ
  5. すぐわかるオブジェクト指向Perlの第五章を読んだ

感想

第一章は、いきなりモジュールを使います。そして、この本を学べはあんなことこんなことを出来てしまうという説明が具体的に書いてあります。本書は、フレンドリーな文章の書き方。 徹底した素人目線で語る。という2つの特徴を併せ持っています。オライリーのような硬い文章ではなく、柔らかい文章で応援してくれる。そういう本です。

メモ

本書では以下のことが学ぶことが出来る

リファレンス
パッケージ
モジュール
オブジェクト指向プログラミング

これらを学ぶことにより何が可能になるか?

・1つのプログラムを分割する
・分割したプログラム部分が必要な協調関係を持つようになる
・分割したプログラム部分が他の部分に対して不当な干渉、のぞき見を行えないようにする
オブジェクト指向というプログラミングの新しい「考え方」を知る


実際にFile::Findモジュールを使ってリファレンス、パッケージ、モジュールについての疑問を浮かばせるように本書は構成されている。

一章の時点で、なぜ関数にサブルーチンのリファレンスを渡すのか、File::Findの「::」は何の意味があるのかは説明されてはいない。後の章でしっかりと説明しますとだけ書いてある。

疑問をモチベーションにして読みましょうとすら、書いてある。


後置if 後置unlessを「パッ」と読めるようになりたい。本書では、例としてこのようなコードがある。

sub fileProc {
  print "$File::Find::name\n" if -f $_;
}

順番が頭のなかでごっちゃになるので、プログラムがどのような順番で処理をしているか番号を付けてみる。

1. if -f $_;
2. print "$File::Find::name\n"

2(print "$File::Find::name\n")1(if -f $_;)

本書のなかではこのように後置ifを解説している

式 if 条件;

これが後置if

if (条件) { 式 }

もともとはこのような形をしている

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl

すぐわかるオブジェクト指向Perlを買った

購入理由

モジュールを使っている時に、リファレンスやオブジェクト指向に迷うことが多かったで買ってみた。読書のゴール地点は、これらの理解して他人の作ったモジュールを使ったり、なぜ動いてるか知ることが出来るようになること。