gpt4 book ai didi

arrays - 测试数组中 `undef` 与 "empty slot"的差异

转载 作者:行者123 更新时间:2023-12-04 02:36:52 24 4
gpt4 key购买 nike

我有一个数据结构,它包含一个带有预分配槽(“空槽”)的数组。编写打印例程时,我想知道如何区分“空插槽”和具有 undef 值的插槽。Perl 调试器可以做到这一点,但我不知道它如何检测到差异。

例子:

  DB<10> $r = []
DB<11> $#$r=4
DB<12> $r->[4]=undef
DB<13> x $r
0 ARRAY(0x55d8fa6797e8)
0 empty slot
1 empty slot
2 empty slot
3 empty slot
4 undef

最佳答案

empty slot 指的是一个不存在的标量(NULL 指针,在 C 术语中),而 undef 指的是一个不存在的标量存在但未定义(指向不包含任何值的标量的指针)。

exists可用于确定元素的值是否存在。 (对于数组边界之外的元素,它也会返回 true。)

defined可用于确定元素是否已定义。 (对于数组边界之外的元素和具有不存在值的元素,它也会返回 true。)

请不要在数组元素上使用 exists。与替代方案相比,依赖于识别元素是否存在的代码可读性和可维护性较差。文档说它甚至不可靠:

WARNING: Calling exists on array values is strongly discouraged. The notion of deleting or checking the existence of Perl array elements is not conceptually coherent, and can lead to surprising behavior.


use feature qw( say );

sub info {
my ($a, $i) = @_;
if ( $i >= @$a ) { say "$i: Non-existent slot" }
if ( !exists($a->[$i]) ) { say "$i: Non-existent scalar" }
if ( !defined($a->[$i]) ) { say "$i: Undefined" }
if ( !$a->[$i] ) { say "$i: False" }
if ( $a->[$i] ) { say "$i: True" }
say "";
}

my @a;
$a[1] = undef;
$a[2] = 0;
$a[3] = 1;

info(\@a, $_) for 4,0..3;

输出

4: Non-existent slot
4: Non-existent scalar
4: Undefined
4: False

0: Non-existent scalar
0: Undefined
0: False

1: Undefined
1: False

2: False

3: True

关于arrays - 测试数组中 `undef` 与 "empty slot"的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61380733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com