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


二重に型をもつ SV

スカラ変数は、通常、整数、倍精度、ポインタ、リファレンスのいずれか 1 つ の型をとります。Perl は、実際のデータに対して、蓄積されている型から、要 求されている型へ、自動的に変換を行ないます。

ある種のスカラ変数は、複数の型のスカラデータを持つようになっています。た とえば、変数 $! は、errno の数値としての値と、 sys_errlist[] から取り出した同値な文字列を持っています。

SV に複数のデータ値を入れるようにするには、2 つのことをしなくてはなりま せん。スカラ型を別に追加するために、sv_set*vルーティンを使用する こと。それから、フラグを設定して Perlに複数のデータを持っていることを知 らせることです。フラグを設定するための 4 つのマクロは:

SvIOK_on
SvNOK_on
SvPOK_on
SvROK_on

です。使用するマクロは、最初にどの sv_set*v ルーティンを呼ぶのか に関わってきます。これは、 sv_set*v ルーティンはすべて、特定のデー タ型のビットだけを設定し、他をクリアしてしまうからです。

たとえば、"dberror" という新しい Perl 変数を作って、エラー値を数値とメッ セージ文字列で持つようにするには、以下のように書きます:

extern int  dberror;
extern char *dberror_list;

SV* sv = perl_get_sv("dberror", TRUE);
sv_setiv(sv, (IV) dberror);
sv_setpv(sv, dberror_list[dberror]);
SvIOK_on(sv);

もし、 sv_setivsv_setpv の順序が逆であれば、 SvIOK_on マク ロの代わりに、 SvPOK_on マクロを呼ばなければなりません。


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

検索式: