これまでの例では、Perl sub の名前を C から呼ばれるように扱ってきました。 ですが、ときには Perl スクリプトの中から、Perl sub の名前を指定すること ができないと、困ることがあります。
sub fred { print "Hello there\n" ; } CallSub("fred") ;
のような Perl コードを考えてみましょう。 `CallSub' を定義する `XSUB' の一部は、
void CallSub(name) char * name CODE: PUSHMARK(sp) ; perl_call_pv(name, G_DISCARD|G_NOARGS) ;
のようになります。今のところは、これで良いのかもしれません。問題は、Perl
sub が文字列でしか表現できないということです。Perl 4 では、これで十分な
のですが、Perl 5 では sub へのリファレンスや無名の sub が許されています。
そういった場合に、perl_call_sv
が役に立つのです。
次の `CallSub' のコードは、先のものと同一ですが、引数 name を
SV*
で定義し、 perl_call_pv
の代わりに perl_call_sv
を使っています。
void CallSub(name) SV* name CODE: PUSHMARK(sp) ; perl_call_sv(name, G_DISCARD|G_NOARGS) ;
fred
を呼ぶのに SV
を使っていますから、Perl 側では、
CallSub("fred") ; Callsub(\&fred) ; $ref = \&fred ; CallSub($ref) ; CallSub( sub { print "Hello there\n" } ) ;
といった記法が、すべて可能になります。ご覧のように、perl_ call_sv を使え ば、Perl sub をかなり柔軟に指定することができるようになります。
Go to the first, previous, next, last section, table of contents.