我需要處理哈希值取決於值類型。這裏是有問題的代碼:如何在Perl中處理哈希值類型XS
I32 keys = hv_iterinit(hash);
for (I32 i = 0; i < keys; i++)
{
char *key = NULL;
I32 key_length = 0;
SV *value = hv_iternextsv(hash, &key, &key_length);
// SvROK(value);
if (SvTYPE(SvRV(value)) < SVt_PVAV)
{
// handle scalar
printf("key %s has scalar value\n", key);
}
else if (SvTYPE(SvRV(value)) == SVt_PVAV)
{
// handle array
printf("key %s has array value\n", key);
}
else if (SvTYPE(SvRV(value)) == SVt_PVHV)
{
// handle hash
printf("key %s has hash value\n", key);
}
}
如果我不使用註釋行,我有標量值的問題。例如具有以下哈希{a => "b", c => {d => "e"}}
是產生輸出:
key c has hash value
key d has scalar value
因此,這裏是我的問題:
- 難道我們總是從
hv_iternextsv()
返回的引用,有時它返回標? - 爲什麼我看不到關鍵字
a
的標量值輸出。
更新。
我的錯誤是與hv_iternextsv()
的結果一起工作。我在想這總是一個參考。這裏是如何工作的代碼如下所示:
I32 keys = hv_iterinit(hash);
for (I32 i = 0; i < keys; i++)
{
char *key = NULL;
I32 key_length = 0;
SV *value = hv_iternextsv(hash, &key, &key_length);
if (!SvROK(value))
{
// handle scalar
}
else
{
if (SvTYPE(SvRV(value)) == SVt_PVAV)
{
// handle array
}
else if (SvTYPE(SvRV(value)) == SVt_PVHV)
{
// handle hash
}
}
}
我期待你的貼缺少一些括號,因爲這將無法編譯。也許你的意思是:'if(SvTYPE(SvRV(value))== SVt_PVAV)'? – LeoNerd
代碼更新,謝謝。 –
@ikegami我更新了我的問題。問題,我沒有看到關鍵'a'的標量值輸出。 –