delete delete EXPR
这个函数从指定散列或者数组删除一个元素(或者一段元素)。(如果你想删除一个文件请参阅 unlink。)被删除的元素会按照声明它们的顺序返回,不过对捆绑的变量(比如 DBM 文件)不能保证这一点。在删除操作之后,对任何已经删除的键字或者索引调用 exists 函数都会返回假值。(相比之下,在 undef 函数之后,exists 函数仍然返回真值,因为 undef 函数只是撤消该元素的数值的定义,并没有删除该元素本身。)
从 %ENV 散列删除则修改环境。从一个与(可写的)DBM 文件绑定的散列删除记录将导致从 DBM 文件把该散列删除掉。
在过去的版本里,你只能从散列里删除记录,但是到了 Perl 5.6,你也可以从一个数组里删除东西。从一个数组删除记录导致在声明位置的元素完全回复到未初始化的状态,但是这样的删除并不弥合所造成的裂缝,因为那样做会导致所有随后的记录的位置的变化。你可以使用 splice 实现这样的目的。(不过,如果你删除了数组的最后一个元素,数组的尺寸将减一(或者更多,取决于倒数第二位的元素(如果存在的话)的位置。))
EXPR 可以是任意复杂,前提是其最终操作是一个散列或者一个数组查找:
# 设置一个散列数组的数组 $dungeon[$x][$y] = \%properties; # 从散列中删除一个属性 delete $dungeon[$x][$y]{"OCCUPIED"}; # 一次从散列中删除三个属性 delete @{ $dungeon[$x][$y] }{ "OCCUPIED", "DAMP", "LIGHTED" }; # 从数组中把 %properties 的引用删除 delete $dungeon[$x][$y];
下面的本机例子低效地删除所有 %hash 中的值:
foreach $key (keys %hash) { delete $hash{$key}; }
下面这个一样:
delete @hash{keys %hash};
但上面两个都比给散列赋予一个空列表或者解除它的定义来得慢:
%hash = (); # 彻底清空 %hash undef %hash; # 忘记 %hash 曾经存在过。类似的是数组的删除:
foreach $index (0 .. $#array) { delete $array[$index]; }和:
delete @array[0 .. $#array];都比下面的低效:
@array = (); # 彻底清空 @array undef @array; # 忘记 @array 曾经存在过