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_yes
と sv_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.