Go to the first, previous, next, last section, table of contents.


例 7: perl_call_sv を使う

これまでの例では、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' のコードは、先のものと同一ですが、引数 nameSV* で定義し、 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.

検索式: