2008/11/16
Perlで書く 2008.11.16 Vol.222
===================================================================== Perlで書く 2008.11.16 Vol.222 [WAZA]関数処理をラップする http://www2u.biglobe.ne.jp/~MAS/perl/ ===================================================================== ●関数処理をラップする Hook::LexWrapモジュールを使うと、関数を書き換えずに関数の前後に 処理を挿入したり、関数の返値を変更することができます。 --------------------------------------------------------------------- # 前後に処理を挿入する use strict; use warnings; use Hook::LexWrap; wrap 'foo', pre => sub { print "前処理\n"; }, post => sub { print "後処理\n"; }; foo(); bar(); sub foo { print "foo()\n"; } sub bar { print "bar()\n"; } __END__ [実行結果] 前処理 foo() 後処理 bar() --------------------------------------------------------------------- # 処理の横取り use strict; use warnings; use Hook::LexWrap; wrap 'foo', pre => sub { my ($value) = @_; # $_[-1]に値を設定すると処理を横取りできます $_[-1] = "$valueは奇数" if $value % 2 != 0; }; foreach my $i (1..5) { print foo($i), "\n"; } sub foo { my $value = shift; return "$valueです"; } __END__ [実行結果] 1は奇数 2です 3は奇数 4です 5は奇数 --------------------------------------------------------------------- # 返値の書き換え use strict; use warnings; use Hook::LexWrap; wrap 'foo', post => sub { # $_[-1]に値を設定すると返値を書き換えます # 呼び出しがリストコンテキストの場合 # $_[0]に返値のリストのリファレンスが入ります if (ref $_[0] eq 'ARRAY') { $_[-1] = $_[0]->[0] . "です"; } else { $_[-1] = $_[0] . "です"; } }; foreach my $i (1..5) { print foo($i), "\n"; } sub foo { my $value = shift; return $value; } __END__ [実行結果] 1です 2です 3です 4です 5です --------------------------------------------------------------------- ●関連項目 ・トレース表示 http://www2u.biglobe.ne.jp/~MAS/perl/waza/trace.html ===================================================================== ■雑記 手を動かして覚える正規表現の置換処理編(*1)とリファレンス(*2)を公開 しました。 ATOKからPerlやRubyのプログラムを実行できるようになりました(*3)。 アイデア次第で面白いことができそうです。 *1 http://books.ivory.ne.jp/regexp/replace.html *2 http://books.ivory.ne.jp/regexp/reference.html *3 http://atok.com/useful/developer/api/index.html ===================================================================== Perlで書く(マガジンID:0000109251) 配信数:852 発行者:MAS 本メールマガジンに関するご意見・お問い合わせは t-masuda@mvd.biglobe.ne.jp までお寄せ下さい。 解除 http://www2u.biglobe.ne.jp/~MAS/perl/magazine.html 検索 http://www2u.biglobe.ne.jp/~MAS/perl/search/index.html バックナンバー http://archive.mag2.com/0000109251/index.html RSS http://archive.mag2.com/0000109251/rss10.xml 本メールマガジンは「まぐまぐ」 http://www.mag2.com/ を利用して発行 しています。 =====================================================================


