PERLGUTS(1) USER COMMANDS PERLGUTS(1) NAME perlguts - Perl の内部関数 DESCRIPTION このドキュメントでは Perl の実行ファイルの内部関数をいくつか 記述しています。 完璧なものではありませんし、間違いも多いと 思います。 疑問点やコメントは後に示す著者に行なってください。 データ型 Perl では、主となる 3 つのデータ型を扱うために 3 つの typedef を行なっています: SV スカラ値 AV 配列値 HV ハッシュ値 それぞれの typedef には様々なデータ型を操作するための特別な ルーティンが用意されています。 "IV" とは Perl では、整数でもポインタでも十分に入れることのできる、特 別な typedef IV を使います。 Perl ではまた、常に 32 bit の整数となる特別な typedef I32 も 使用します。 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*); Perl manpages Last change: Release 5.0 Patchlevel 00 1 PERLGUTS(1) USER COMMANDS PERLGUTS(1) 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) Perl manpages Last change: Release 5.0 Patchlevel 00 2 PERLGUTS(1) USER COMMANDS PERLGUTS(1) ただし、これらは 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*) を呼びます。 普通は、この呼び出しは必要ありません。 「揮発性」の章を参照 してください。 プライベート値とバブリック値 自分で持っていれるスカラの型を決定する通常の方法は、マクロ Sv[INP]OK を使うのでした。 スカラは数値にも文字列にもなり得 ますから、普通、これらのマクロはいつも真を返し、Sv[INV]V マ クロを呼ぶことで、文字列から整数/倍精度、整数/倍精度から文字 列への変換を行ないます。 Perl manpages Last change: Release 5.0 Patchlevel 00 3 PERLGUTS(1) USER COMMANDS PERLGUTS(1) もし、本当に SV にあるのが整数か、倍精度か、文字列ポインタか を知りたいのであれば、代わりに、 SvIOKp(SV*) SvNOKp(SV*) SvPOKp(SV*) というマクロを使うことができます。 これらは、実際に SV に入 っているものが整数か、倍精度か、文字列ポインタかを教えてくれ ます。 しかし、一般には、Sv[INP]V マクロを使うだけにした方が良いで しょう。 AV を使う AV を生成して、値を設定するのには、2 つの方法があります。 最初の方法は、単に空の AV を作るものです: AV* newAV(); ふたつめの方法は、AV を生成した上で、初期値として SV の値を 入れます: AV* av_make(I32 num, SV **ptr); ふたつめの引数は、num 個の SV* の配列を指しています。 いったん、AV が生成されると、AV に対して、 void av_push(AV*, SV*); SV* av_pop(AV*); SV* av_shift(AV*); void av_unshift(AV*, I32 num); といった操作が行えます。 これらは、av_unshift を除いては、 お馴染みの演算でしょう。 av_unshift は、配列の先頭に、num 個の undef 値の要素を付け加えます。 その後で、(あとで述べる) av_store を使って、新しい要素に値を代入しなければなりません。 他にもいくつか関数があります: I32 av_len(AV*); /* 配列の大きさを返す */ SV** av_fetch(AV*, I32 key, I32 lval); /* オフセットが key の位置から値を取り出すが、lval がゼロでないとき、値を lval に設定するようだ */ SV** av_store(AV*, I32 key, SV* val); /* オフセットが key の位置に val を設定する */ Perl manpages Last change: Release 5.0 Patchlevel 00 4 PERLGUTS(1) USER COMMANDS PERLGUTS(1) void av_clear(AV*); /* すべての要素をクリアするが、配列は残す */ void av_undef(AV*); /* 全要素を除去し、配列を未定義にする */ 配列変数の名前がわかるのであれば、 AV* perl_get_av("varname", FALSE); を使えば、AV へのポインタが得られます。 その変数が存在しな ければ、NULL を返します。 HV を使う HV を生成するには、 HV* newHV(); というルーティンを使います。 いったん、HV が生成されると、 HV に対して、 SV** hv_store(HV*, char* key, U32 klen, SV* val, U32 hash); SV** hv_fetch(HV*, char* key, U32 klen, I32 lval); という操作が行えます。 引数 klen は、渡される key の長さで す。 引数 val は、設定されるスカラへの SV ポインタを入れ、 hash は、あらかじめ計算したハッシュ値 (hv_store に計算させる 場合には、ゼロ) です。 引数 lval で、このフェッチ操作が、実 はストア操作の一部であるかを示します。 hv_store や hv_fetch は、SV** を返すもので、SV* ではないこと に注意してください。 スカラ値をアクセスするには、まず返却値 を被参照する必要があります。 しかし、その前に返却値が NULL でないことを確認すべきです。 ハッシュテーブルのエントリが存在するかをチェックし、削除する 関数があります。 bool hv_exists(HV*, char* key, U32 klen); SV* hv_delete(HV*, char* key, U32 klen); そして、その他の諸々の関数: void hv_clear(HV*); /* ハッシュテーブルのすべてのエントリをクリアする */ void hv_undef(HV*); /* ハッシュテーブルを未定義にする */ I32 hv_iterinit(HV*); /* ハッシュテーブルを走査する開始点を準備する */ Perl manpages Last change: Release 5.0 Patchlevel 00 5 PERLGUTS(1) USER COMMANDS PERLGUTS(1) HE* hv_iternext(HV*); /* 次のエントリを取り出し、key と value が入った 構造体へのポインタを返す */ char* hv_iterkey(HE* entry, I32* retlen); /* HE 構造体から key を取り出し、また、key 文字 列の長さを返す */ SV* hv_iterval(HV*, HE* entry); /* HE 構造体の value への SV ポインタを返す */ ハッシュ変数の名前がわかるのであれば、 HV* perl_get_hv("varname", FALSE); を使うことで、HV へのポインタが得られます。 その変数が存在 しなければ、NULL を返します。 (興味ある方のために、) ハッシュのアルゴリズムは、 i = klen; hash = 0; s = key; while (i--) hash = hash * 33 + *s++; となっています。 リファレンス リファレンスは、(リファレンスを含む) 他のスカラ型を指す、特 別なスカラ型です。 AV や HV をスカラとして扱うには、単に AV や HV を SV にキャストするだけのことです。 リファレンスを生成するには、 SV* newRV((SV*) pointer); というコマンドを使います。 いったん、リファレンスができると、 適切な typedef (AV, AV, HV) へのキャストを用いて、 SvRV(SV*) というマクロが使うことができ、返された SV* を AV* か HV* に キャストして、適切なルーティンを呼ぶことになります。 リファレンスを被参照した後も、まだリファレンスであるかを調べ るには、 SvROK(SV*) というマクロが使えます。 Perl manpages Last change: Release 5.0 Patchlevel 00 6 PERLGUTS(1) USER COMMANDS PERLGUTS(1) XSUB と引数スタック XSUB の仕組みは、Perl プログラムが C のサブルーティンをアク セスするための単純な方法です。 XSUB には、Perl プログラムか らの引数を入れるスタックと、Perl のデータ構造を C の同等なも のにマッピングする方法を用意しています。 スタック引数は、ST(n) というマクロでアクセスできます。 これ は、n 番目のスタック引数を返すものです。 引数 0 は、Perl の サブルーティン呼び出しで渡された、最初の引数です。 これらの 引数は SV* で、SV* が使われるところであれば、どこでも使うこ とができます。 ほとんどの場合には、C ルーティンからの出力は、RETVAL と OUTPUT: ディレクティブを使って扱うことができます。 しかし、 引数スタックのスペースがすべての返却値を扱うのに、十分でなく なる場合があります。 例としては、引数をとらないで、ローカル なタイムゾーンと、夏時間の省略形の二つの返却値を返す、POSIX tzname() の呼び出しがあります。 このような状況を扱うためには、PPCODE: ディレクティブを使い、 EXTEND(sp, num); というマクロを使ってスタックを拡張します。 ここで、sp はス タックポインタで、num はスタックを拡張すべき要素の数です。 スタック上に場所を確保したならば、IV、倍精度、文字列、SV ポ インタをプッシュする、 PUSHi(IV) PUSHn(double) PUSHp(char*, I32) PUSHs(SV*) というマクロを使って、値をスタックへプッシュします。 これで、tzname をよぶ Perl プログラムでは、二つの値は、 ($standard_abbrev, $summer_abbrev) = POSIX::tzname; というように代入できます。 スタックに値を積む、別の (おそら く、より簡単な) 方法は、 XPUSHi(IV) XPUSHn(double) XPUSHp(char*, I32) XPUSHs(SV*) というマクロを使うものです。 こちらのマクロは、必要ならば、 自動的にスタックを調整してくれます。 Perl manpages Last change: Release 5.0 Patchlevel 00 7 PERLGUTS(1) USER COMMANDS PERLGUTS(1) 揮発性 Perl では、値は通常「不揮発な」ものです。 つまり、(Perl の undef 呼び出しや、Perl 自身で他のルーティンを通じて) 明示的 に解放しない限り、解放されることはありません。 先の tzname の例では、文字列であるところの、二つの新しい SV を引数スタックに積むために、生成する必要がありました。 しか し、これらは最終的にはスカラ変数を保持する SV にコピーされま すから、新しい SV に永久に固執するものではありません。 「揮発性」の SV (あるいは、AV や HV) は、普通の「不揮発性」 の SV、AV、HV と全く同じように動作しますが、「現在の文脈」で しか有効ではないものです。 Perl インタプリタが現在の文脈を 離れると、揮発性の SV、AV、HV は自動的に解放されます。 一般 に「現在の文脈」というのは、Perl の一つの実行文を表わします。 揮発性の変数を生成するには、 SV* sv_newmortal() SV* sv_2mortal(SV*) SV* sv_mortalcopy(SV*) という関数を使います。 最初のものは揮発性の SV を生成し、ふ たつめは、既にある SV を揮発性の SV に変換します。 三つめは、 既に存在する SV の揮発性のコピーを生成します。 揮発性のルーティンは、単に SV のためだけではありません。 AV や HV も、sv_2mortal や sv_mortalcopy ルーティンに、アドレス を (SV* にキャストして) 渡すことで、揮発性にすることができま す。 新しい変数の生成 Perl スクリプトからアクセスできる、新しい Perl の変数を生成 するには、変数の型に応じて、 SV* perl_get_sv("varname", TRUE); AV* perl_get_av("varname", TRUE); HV* perl_get_hv("varname", TRUE); というルーティンを使用します。 二番目の引数としては TRUE を 使います。 新しい変数は、データの型に合ったルーティンを使っ て、設定することができます。 スタッシュとオブジェクト スタッシュとは、パッケージ内にある、すべての異なるオブジェク トが入っているハッシュテーブル (連想配列) のことです。 ハッ シュテーブルの個々の key は、(同じ名前のすべての異なる型のオ ブジェクトで共有される) シンボル名で、ハッシュテーブルの個々 の value は、(グローバル値のための) GV と呼ばれます。 GV に は、 Perl manpages Last change: Release 5.0 Patchlevel 00 8 PERLGUTS(1) USER COMMANDS PERLGUTS(1) スカラ値 配列値 ハッシュ値 ファイルハンドル ディレクトリハンドル フォーマット サブルーティン を含む (これらに限りませんが)、その名前の様々なオブジェクト へのリファレンスが次々に入ることになります。 Perl は、(グローバル変数のための) GV 構造体に様々なスタッシ ュを入れますが、それらは、HV 構造体で表されます。 特定のパッケージの HV ポインタの入手には、 HV* gv_stashpv(char* name, I32 create) HV* gv_stashsv(SV*, I32 create) という関数を使います。 最初の関数が、リテラル文字列をとり、 二番目が SV に入れた文字列を使います。 gv_stash*v が使う name は、シンボルテーブルを手に入れようと するパッケージの名前です。 デフォルトのパッケージは、main というものです。 多重にネストしたパッケージであれば、Perl での場合と同様に、:: で区切って gv_stash*v に名前を渡すのが 正しい方法です。 もし、bless されたリファレンスである SV があれば、 HV* SvSTASH(SvRV(SV*)); を使っても、スタッシュポインタを探すことができ、パッケージ名 自身は、 char* HvNAME(HV* stash); で得られます。 Perl スクリプトへ bless された値を返す必要があれば、 SV* sv_bless(SV*, HV* stash) という関数が使えます。 最初の引数 SV* は、リファレンス、二 番目の引数がスタッシュです。 返された SV* は、他の SV と同 様に使うことができます。 マジック [執筆中] Perl manpages Last change: Release 5.0 Patchlevel 00 9 PERLGUTS(1) USER COMMANDS PERLGUTS(1) 二重に型をもつ 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_setiv と sv_setpv の順序が逆であれば、SvIOK_on マク ロの代わりに、SvPOK_on マクロを呼ばなければなりません。 C プログラムから Perl ルーティンを呼び出す C プログラムから、Perl サブルーティンを呼び出すために使用す ることのできるルーティンが 4 つあります。 その 4 つは: I32 perl_call_sv(SV*, I32); I32 perl_call_pv(char*, I32); I32 perl_call_method(char*, I32); I32 perl_call_argv(char*, I32, register char**); です。 最もよく使われるはずのものは、perl_call_sv です。 Perl manpages Last change: Release 5.0 Patchlevel 00 10 PERLGUTS(1) USER COMMANDS PERLGUTS(1) 引数 SV* には、呼び出される Perl サブルーティンの名前か、そ のサブルーティンへのリファレンスを含むものです。 2 番目の引 数は、Perl サブルーティンが返す値があれば、それがどんなもの かを該当ルーティンに知らせます。 4 つのルーティンはいずれも、サブルーティンが Perl スタック上 に返した引数の数を返します。 これら 4 つのルーティンを使うときには、プログラマが Perl ス タックを操作しなくてはなりません。 以下のマクロと関数が用意 されています: dSP PUSHMARK() PUTBACK SPAGAIN ENTER SAVETMPS FREETMPS LEAVE XPUSH*() 詳しくは perlcall manpage を参照してください。 Memory Allocation [執筆中] AUTHOR Jeff Okamoto <okamoto@corp.hp.com> With lots of help and suggestions from Dean Roehrich, Malcolm Beattie, Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, and Neil Bowers. DATE Version 12: 1994/10/16 Perl manpages Last change: Release 5.0 Patchlevel 00 11