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


Perl 変数

これから、XSUB でどのように Perl の変数 $host をアクセスするかを 示します。 perl_get_sv() という関数が、内部的に `SV' (スカラ 変数) といわれている変数へのポインタを得るために使用されます。変数の名前 には、パッケージ名 RPC が付け加えられますので、 perl_get_sv() で $host がどのパッケージにあるかがわかります。パッケージ名がないときには、 perl_get_sv() では、パッケージ main で変数を探すことになり ます。それから、`SV' の内容への char* ポインタを取得するため、 マクロ SvPVX() を使って `SV' の被参照を行ないます。

void
rpcb_gettime()
     PPCODE:
     {
     char *host;
     SV *hostsv;
     time_t timep;

     hostsv = perl_get_sv( "RPC::host", FALSE );
     if( hostsv != NULL ){
          host = SvPVX( hostsv );
          if( rpcb_gettime( host, &timep ) )
               PUSHs(sv_2mortal(newSVnv(timep)));
     }
     }

この XSUB を呼ぶためには、次のような Perl コードを使います。

$RPC::host = "localhost";
$timep = rpcb_gettime();

上記の例では、`SV' に C の char* が入っていましたが、Perl の スカラ変数には、数値やリファレンスも入れることができます。`SV' に C の int が入っているときには、`SV' の被参照にマクロ SvIVX() を使い、C の double が入っているときには、 SvNVX() を使います。

`SV' が Perl のリファレンスのときには、`SV' の被参照にマクロ SvRV() が使えます。結果は実際の Perl の変数を指す別の `SV'と なります。これは、 SvPVX()SvNVX()SvIVX() で 被参照することができます。次の XSUB では、 SvRV() を使っています。

void rpcb_gettime()
     PPCODE:
     {
     char *host;
     SV *rv;
     SV *hostsv;
     time_t timep;

     rv = perl_get_sv( "RPC::host", FALSE );
     if( rv != NULL ){
          hostsv = SvRV( rv );
          host = SvPVX( hostsv );
          if( rpcb_gettime( host, &timep ) )
               PUSHs(sv_2mortal(newSVnv(timep)));
     }
     }

次の Perl コードは、 $MY::host へのリファレンスとなる、変数 $RPC::host を生成します。変数 $MY::host には、使用するホスト 名が入っています。

$MY::host = "localhost";
$RPC::host = \$MY::host;
$timep = rpcb_gettime();

perl_get_sv() の第 2 引数は、上の例に示したように、通常は `FALSE' にします。この引数を `TRUE' とすると、変数が存在しない ときに、生成するようになります。空の `SV' かも知れないものを扱うた めに段階を踏むのでなければ、 `TRUE' は使用すべきではありません。

XSUB では、Per の配列値、ハッシュ値、コード値をアクセスするために、 perl_get_av()perl_get_hv()perl_get_cv() を 使うことができます。


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

検索式: