Get a hash value using XS

#include <stdio.h>
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

void get_hash_value (pTHX_ HV * hash)
{
    const char * key = "test-key";
    if (hv_exists (hash, key, strlen (key))) {
		SV **svp;
        char * val_pv;
        int val_length;
        int val_iv;
        printf ("The key for '%s' seems to exist.\n", key);
        svp = hv_fetch(hash, key, strlen (key),0);
        val_pv = SvPV (*svp, val_length);
        printf ("As a string, its value is '%s' (length %d).\n", val_pv, val_length);
        if (SvIOK (*svp)) {
            val_iv = SvIV (*svp);
            printf ("As a number, its value is '%d'.\n", val_iv);
        }
        else {
            printf ("Perl doesn't think it's a number.\n");
        }
    }
    else {
        printf ("The key for '%s' doesn't seem to exist.\n", key);
    }
}

void get_hash_value2 (pTHX_ HV * hash)
{
    const char * key = "test-key";
    SV * key_sv;

    key_sv = newSVpv (key, strlen (key));
    if (hv_exists_ent (hash, key_sv, 0)) {
        HE * he;
        SV * val;
        char * val_pv;
        int val_length;
        int val_iv;
        printf ("The key for '%s' seems to exist.\n", key);
        he = hv_fetch_ent (hash, key_sv, 0, 0);
        val = HeVAL (he);
        val_pv = SvPV (val, val_length);
        printf ("As a string, its value is '%s' (length %d).\n", val_pv, val_length);
        if (SvIOK (val)) {
            val_iv = SvIV (val);
            printf ("As a number, its value is '%d'.\n", val_iv);
        }
        else {
            printf ("Perl doesn't think it's a number.\n");
        }
    }
    else {
        printf ("The key for '%s' doesn't seem to exist.\n", key);
    }
}

MODULE = GetHashValue		PACKAGE = GetHashValue		

void get_hash_value (hash)
    HV * hash
    CODE:
    get_hash_value (aTHX_ hash);

use GetHashValue;
%a = ('test-key' => 123);
GetHashValue::get_hash_value (\%a);
GetHashValue::get_hash_value ({bonkers => 1, 'test-key' => "A million", x => 'y'});
GetHashValue::get_hash_value ({});


输出:

The key for 'test-key' seems to exist.
As a string, its value is '123' (length 3).
As a number, its value is '123'.
The key for 'test-key' seems to exist.
As a string, its value is 'A million' (length 9).
Perl doesn't think it's a number.
The key for 'test-key' doesn't seem to exist.


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值