检查 XSUB 中是否未定义数组元素
Check if array elements are undefined from an XSUB
我正在尝试检查数组元素是否是来自 XSUB 的 undef
,如下所示:
void
print_array(array)
AV *array
PREINIT:
int len;
SV **sv_ptr;
SV *sv;
int i;
CODE:
len = av_len(array) + 1;
printf("[");
for (i = 0; i < len; i++) {
sv_ptr = av_fetch( array, i, 0 );
if (!sv_ptr) {
printf("empty");
}
else {
sv = *sv_ptr;
if (sv == &PL_sv_undef) {
printf("undef");
}
else {
printf("*");
}
}
if (i < (len - 1)) {
printf(", ");
}
}
printf("]\n");
如果我 运行 这个来自 Perl 脚本的子程序:
use strict;
use warnings;
use ArrayPrint;
my $array = [];
$array->[4] = undef;
ArrayPrint::print_array($array);
输出为:
[empty, empty, empty, empty, *]
为什么最后一个元素没有显示 undef
?
SV 可以包含未定义的值,但仍然是与 PL_sv_undef 不同的 SV。您需要将 PL_sv_undef 测试替换为
SvGETMAGIC(sv);
if (!SvOK(sv)) { printf "undef" } else { printf "*" }
我正在尝试检查数组元素是否是来自 XSUB 的 undef
,如下所示:
void
print_array(array)
AV *array
PREINIT:
int len;
SV **sv_ptr;
SV *sv;
int i;
CODE:
len = av_len(array) + 1;
printf("[");
for (i = 0; i < len; i++) {
sv_ptr = av_fetch( array, i, 0 );
if (!sv_ptr) {
printf("empty");
}
else {
sv = *sv_ptr;
if (sv == &PL_sv_undef) {
printf("undef");
}
else {
printf("*");
}
}
if (i < (len - 1)) {
printf(", ");
}
}
printf("]\n");
如果我 运行 这个来自 Perl 脚本的子程序:
use strict;
use warnings;
use ArrayPrint;
my $array = [];
$array->[4] = undef;
ArrayPrint::print_array($array);
输出为:
[empty, empty, empty, empty, *]
为什么最后一个元素没有显示 undef
?
SV 可以包含未定义的值,但仍然是与 PL_sv_undef 不同的 SV。您需要将 PL_sv_undef 测试替换为
SvGETMAGIC(sv);
if (!SvOK(sv)) { printf "undef" } else { printf "*" }