これまでの例では、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.