« 独習アセンブラ リスト4-4 | トップページ | 独習アセンブラ リスト5-1 »

2007-11-26

Perlでコールバック サブルーチンの引数としてサブルーチンの参照を渡す

サブルーチンの引数に、
配列、ハッシュ(連想配列)などを渡してきました。
今回は、サブルーチンにサブルーチンを渡します。
C言語のクイックソートのコールバックのように使えます。
渡し方は至って簡単です。
配列やハッシュを渡すのと同じように、
関数のアドレスを渡してやります。

下の例では、サブルーチンsubjectに、
サブルーチンcallbackの参照を渡します。
subject内では引数として渡された、
callbackをfuncという変数に代入し、
このfuncをコールします。
コールすると1秒間待機した後にループします。
このループを10回繰り返します。


01: sub callback
02: {
03:   my $val = $_[0];
04: 
05: # print "\x1b[0D;$val%\n\x1b[1A;";
06:   print "$val%\n";
07: }
08: 
09: sub subject
10: {
11:   my $func = $_[0];
12: 
13:   for ($i = 0; $i < 10; ++$i) {
14:     &$func($i * 10);
15:     sleep(1);
16:   }
17:   print "completed\n";
18: }
19: 
20: &subject(\&callback);


5行目のサブルーチンcallbackのコメントしてある箇所ですが、
Linuxではエスケープシーケンスが利用できますが、
Windows 2000/XPでは、エスケープシーケンスが
利用できないようですので、
Windows 2000/XP以外のOSでテストする場合には、
6行目をコメントとして、5行目を実行させると、
ちょっとそれらしい感じになるかも知れません。
Windows98などは、エスケープシーケンスが利用できるようです。
Windows Vistaは、多分できないと思います。
LinuxとWindows XPのみ検証済みです。

この程度のサブルーチンで、複数箇所から利用されない場合には、 無名サブルーチンの参照を渡してしまうと、もっと簡単になります。
可読性の問題は出てくるかもしれませんが。

callbackサブルーチンをコメント化してしまって、最後の &subject (\&callback); の部分を
&subject ( sub { print "$_[0]%\n"; } );
とすると、callbackサブルーチンを無名サブルーチンのリファレンスとして渡す事ができ、callbackサブルーチンを定義した場合と同じ結果が得られると思います。


|

« 独習アセンブラ リスト4-4 | トップページ | 独習アセンブラ リスト5-1 »

Perl」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Perlでコールバック サブルーチンの引数としてサブルーチンの参照を渡す:

« 独習アセンブラ リスト4-4 | トップページ | 独習アセンブラ リスト5-1 »