Perlでコールバック サブルーチンの引数としてサブルーチンの参照を渡す
サブルーチンの引数に、
配列、ハッシュ(連想配列)などを渡してきました。
今回は、サブルーチンにサブルーチンを渡します。
C言語のクイックソートのコールバックのように使えます。
渡し方は至って簡単です。
配列やハッシュを渡すのと同じように、
関数のアドレスを渡してやります。
下の例では、サブルーチンsubjectに、
サブルーチンcallbackの参照を渡します。
subject内では引数として渡された、
callbackをfuncという変数に代入し、
このfuncをコールします。
コールすると1秒間待機した後にループします。
このループを10回繰り返します。
配列、ハッシュ(連想配列)などを渡してきました。
今回は、サブルーチンにサブルーチンを渡します。
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);
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サブルーチンを定義した場合と同じ結果が得られると思います。
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サブルーチンを定義した場合と同じ結果が得られると思います。
| 固定リンク
| コメント (0)
| トラックバック (0)