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


SV の操作

SV は、1 つのコマンドで生成し、値をロードすることができます。ロードでき る値の型には、整数 (IV)、倍精度 (NV)、文字列 (PV)、その他のスカラ (SV) があります。

これらを行なう、4 つのルーティンは:

SV*  newSViv(IV);
SV*  newSVnv(double);
SV*  newSVpv(char*, int);
SV*  newSVsv(SV*);

です。「既に存在する」スカラの値を変更するために 5 つのルーティンがあり ます:

void  sv_setiv(SV*, IV);
void  sv_setnv(SV*, double);
void  sv_setpvn(SV*, char*, int)
void  sv_setpv(SV*, char*);
void  sv_setsv(SV*, SV*);

sv_setpvn を使って、代入される文字列の長さを指定することもできま すし、 sv_setpv を使って Perl に長さを算出させることもできます。 ただし、sv_setpv は、文字列の長さを NUL 文字で終了することに依存 する strlen を使って算出することに注意しなくてはなりません。

SV が指し示す実際の値をアクセスするには、実際のスカラの型を強制的に IV や倍精度や文字列にする、

SvIV(SV*)
SvNV(SV*)
SvPV(SV*, STRLEN len)

というマクロを使うことができます。

SvPV マクロでは、返される文字列の長さは、変数 len に納めら れます (これはマクロですので、 `&len' としないでください)。もし、デー タの長さを気にしないのであれば、グローバル変数 na を使ってください。ただ し、Perl では `NUL' を含む文字列も、 `NUL' で終端しない文字列 も許されるということを忘れないでください。

単にスカラ値が真かどうかを知りたいだけならば、

SvTRUE(SV*)

を使うことができます。

Perl では、SV にもっとメモリを割り当てて欲しいときには、自動的に文字列を 大きくしてくれますが、まだメモリを割り当てないといけないかを判断してくれ る、

SvGROW(SV*, STRLEN newlen)

というマクロが使えます。もし必要なら、このマクロが sv_grow を呼びます。 SvGROW は SV に割り当てたメモリを増やすだけで、減らすことはできま せん。

手元にある SV の Perl から見た、データの種類を知りたいときには、その SV の型チェックに、

SvIOK(SV*)
SvNOK(SV*)
SvPOK(SV*)

というマクロを使うことができます。

SV に納められた文字列の、現在長を取得したり設定したりするには、以下のマ クロが使います。

SvCUR(SV*)
SvCUR_set(SV*, I32 val)

ただし、これらは SvPOK() が真のときだけ有効です。

もし、スカラ変数の名前がわかるならば、その SV へのポインタは、

SV*  perl_get_sv("varname", FALSE);

を使って得られます。その変数が存在しなければ、 NULL が返されます。

その変数 (あるいは、他の任意の SV) が、実際に定義されているかを知りたい ならば、

SvOK(SV*)

を呼び出してください。

スカラの undef 値は、 sv_undef という SV インスタンスに納 められています。そのアドレスは、 SV* が必要とされるところで使用す ることができます。

ブール値の真と偽を表わす、 sv_yessv_no という値もあり ます。sv_undef と同様に、これらのアドレスも SV* が必要なと ころで、使うことができます。

(SV *0)&sv_undef が同じであると考えて、だまされてはい けません。次のようなコードを見てください:

SV* sv = (SV*) 0;
if (I-am-to-return-a-real-value) {
        sv = sv_2mortal(newSViv(42));
}
sv_setsv(ST(0), sv);

このコードは、実値を返さなければならないときには、(値として42 を持つ) 新 しい SV を返そうとし、さもなくば undef を返そうとします。ですが、 どこかの行でヌルポインタを返して、セグメントバイオレーションが起こるか、 何かおかしな結果になってしまいます。最初の行の `0'`&sv_undef' に変えれば、すべてが旨くいきます。

生成した SV を解放するためには、 SvREFCNT_dec(SV*) を呼びます。普 通は、この呼び出しは必要ありません。「 See section 揮発性, 」の章を参照してく ださい。


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

検索式: