sironekotoroの日記

Perl で楽をしたい

続・はじめてのPerl 第2版 第7章 サブルーチンへのリファレンス

7.1 名前付きサブルーチンの参照

  • これは解る
  • サブルーチンをスカラーで参照する
  • 変数を入れるときは $foo->(bar)

7.2 無名サブルーチン

  • さて解らない
  • この単語からイメージできるものが曖昧すぎて

    私たちは、データ構造の初期化に使うだけ のためにサブルーチン名を考えているわけで、脳細胞を無駄遣いしているのです。しかし無名配列や無名ハッシュが作れたのと同じように、無名サブルーチンを作ることができます。

  • きっと、この辺りは、これから学ぶPerl本でどんどんイメージが借りつつ、本質に近づいていけるさー、と気楽に構えて進む

7.3 コールバック

  • File::Find を例にとって。
  • 第一引数にサブルーチンリファレンスを要求する
    • File::Findした結果をサブルーチンリファレンスで処理して出力なりする、と

7.4 クロージャ

  • これも「無名サブルーチン」並にわからない単語

    宣言時に存在していたすべてのレキシカル変数にアクセスできるようなサブルーチンをクロージャ(または閉包。元は数学用語です)と呼びます。Perl では、クロージャとはスコープから外れたレキシカル変数を参照するサブルーチンのことです。

  • うむ、わからん

7.5 サブルーチンからサブルーチンを返す

  • サブルーチンからの返り値をサブルーチンリファレンスにする
use File::Find;

sub create_find_callbacks_that_sum_the_size {
    my $total_size = 0;
    return(sub { $total_size += -s if -f }, sub { return $total_size });
}

my ($count_em, $get_results) = create_find_callbacks_that_sum_the_size( ); find($count_em, 'bin');
my $total_size = &$get_results( );
print "total size of bin is $total_size\n";
  • うう、なんでそんなことしてるのか、わからん
    • File::Find が第一引数にサブルーチンリファレンスしかとれず、引数を与えることができないってのは解ったんだけど
  • えっと、ファイルサイズ合計を求めるときの合計値を入れる変数があり、これをサブルーチンから更新(足していく)。
  • このときの合計値を入れる変数はサブルーチン外にあるんで、値は保持される
    • サブルーチン外の変数にアクセスするから、これがクロージャ
  • ファイルサイズの合計を求めるサブルーチンと、その値を返すサブルーチンを作っている・・・んだよな
  • サブルーチンの中にサブルーチンを入れて、選択的に実行できないから?
sub foo {
    sub bar{
    }
}
  • fooの外から、barだけ実行したいとかできない・・・から、サブルーチンリファレンスを使う?
  • サブルーチンのなかでサブルーチンが使えない、ってこと?

7.6 入力としてのクロージャ変数

  • サブルーチンの引数に入力した値を、クロージャが参照する
  • これは解る

7.7 静的ローカル変数としてのクロージャ変数

  • ここのカウンタ例はもう、覚えるほど書いた。
  • 解らないなら書写するしかない・・・そのうち、解るようになるだろう的な
{
     my $count = 0;
     sub count_add { ++$count }
     sub count_now {$count}
}

say count_add(); # 1
say count_add(); # 2
say count_add(); # 3
say count_add(); # 4

say count_now(); # 4

  • ブロックの中のサブルーチンが、サブルーチン外の変数$countを参照しているので、クロージャ
  • ここも、加算するサブルーチンと、現在値を返すサブルーチンに分かれているんだよなぁ

むー

  • クロージャのサンプルをいくつかサブルーチンに置き換えて見ようと思ったけど、うまくいかない
  • 本に載っているクロージャのサンプルはブロックで囲んだだけのものなんだけど、そういうものなんだろうか
  • さすがに、ここまでくると、本当に理解できない概念とかが出てきてうへーってなる