#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.