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


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_storehv_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*);
      /* ハッシュテーブルを走査する開始点を準備する */

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++;

となっています。


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

検索式: