给定一个表达式,该表达式指定哈希的元素或切片,delete
会从该哈希中删除指定的元素,以便对该元素使用 exists
将不再返回真值。将哈希元素设置为未定义的值不会删除其键,但删除它会;请参阅 exists
。
在列表上下文中,通常返回删除的值,或在标量上下文中返回最后一个这样的元素。返回列表的长度对应于参数列表的长度:删除不存在的元素会在其对应位置返回未定义的值。从 Perl 5.28 开始,可以将 键/值哈希切片 传递给 delete
,返回值是键/值对列表(从哈希中删除的每个项目有两个元素)。
delete
也可以用于数组和数组切片,但其行为不太直观。虽然 exists
会对已删除的条目返回假值,但删除数组元素永远不会改变现有值的索引;请使用 shift
或 splice
来实现这一点。但是,如果任何删除的元素位于数组的末尾,数组的大小将缩小到仍然对 exists
测试为真的最高元素的位置,或者如果没有任何元素为真,则缩小到 0。换句话说,数组在删除后不会有尾随的非存在元素。
警告:强烈建议不要对数组值调用 delete
。删除或检查 Perl 数组元素的存在的概念在逻辑上是不连贯的,会导致意外的行为。
从 %ENV
中删除会修改环境。从与 DBM 文件绑定的哈希中删除会从 DBM 文件中删除该条目。从 tied
哈希或数组中删除不一定返回任何内容;这取决于 tied
包的 DELETE 方法的实现,该方法可以执行任何它想要的操作。
delete local EXPR
结构在运行时将删除局部化到当前块。在块退出之前,局部删除的元素暂时不再存在。请参阅 "perlsub 中的复合类型的元素的局部删除"。
my %hash = (foo => 11, bar => 22, baz => 33);
my $scalar = delete $hash{foo}; # $scalar is 11
$scalar = delete @hash{qw(foo bar)}; # $scalar is 22
my @array = delete @hash{qw(foo baz)}; # @array is (undef,33)
以下(低效地)删除 %HASH 和 @ARRAY 的所有值
foreach my $key (keys %HASH) {
delete $HASH{$key};
}
foreach my $index (0 .. $#ARRAY) {
delete $ARRAY[$index];
}
这些也是如此
delete @HASH{keys %HASH};
delete @ARRAY[0 .. $#ARRAY];
但两者都比将空列表赋值或取消定义 %HASH 或 @ARRAY 速度慢,而这正是清空聚合的常用方法
%HASH = (); # completely empty %HASH
undef %HASH; # forget %HASH ever existed
@ARRAY = (); # completely empty @ARRAY
undef @ARRAY; # forget @ARRAY ever existed
EXPR 可以任意复杂,只要其最终操作是聚合的元素或切片
delete $ref->[$x][$y]{$key};
delete $ref->[$x][$y]->@{$key1, $key2, @morekeys};
delete $ref->[$x][$y][$index];
delete $ref->[$x][$y]->@[$index1, $index2, @moreindices];