2009-06-07
■ [コールバック]コールバック

関数の引数に関数を使うための作法
関数の戻り値ではなく、関数自体を引数として使う場合に
引数には関数のリファレンスを使う。例えばこんな感じで
&呼び出し側の関数名(\&呼び出される関数名 [,引数])
もしくは
&呼び出し側の関数名(sub{ コード } [,引数])
この例だと、コールバック関数(呼び出される関数)を第一引数に使っているけど、そうじゃなくてもOK
定義済みの関数をコールバック関数として使う
呼び出し側の関数(call)の引数に合計関数(sum)と平均関数(ave)を使う
#!/usr/bin/perl -wl use strict; my @numbers = (2,3,4); &call(\&sum, @numbers); &call(\&ave, @numbers); exit 0; sub call{ my $func = shift; # &$func(@_); print $func->(@_); } sub sum{ my $total = 0; foreach( @_ ){ $total += $_; } $total; } sub ave{ my $num = scalar @_; return &sum(@_) / $num; }
無名の関数をコールバック関数として使う
引数の積を返す関数(無名関数)を使った例
#!/usr/bin/perl -wl use strict; my @numbers = (2,3,4); &call( sub{ my $total = shift; foreach( @_ ){ $total = $total * $_; } $total; }, @numbers ); exit 0; sub call{ my $func = shift; # &$func(@_); print $func->(@_); }
どんな時に使うの?
この辺が僕のレベルだと実感できないところ...
コメントを書く
トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090607