delete EXPR

给定一个表达式,该表达式指定哈希的元素或切片,delete 会从该哈希中删除指定的元素,以便对该元素使用 exists 将不再返回真值。将哈希元素设置为未定义的值不会删除其键,但删除它会;请参阅 exists

在列表上下文中,通常返回删除的值,或在标量上下文中返回最后一个这样的元素。返回列表的长度对应于参数列表的长度:删除不存在的元素会在其对应位置返回未定义的值。从 Perl 5.28 开始,可以将 键/值哈希切片 传递给 delete,返回值是键/值对列表(从哈希中删除的每个项目有两个元素)。

delete 也可以用于数组和数组切片,但其行为不太直观。虽然 exists 会对已删除的条目返回假值,但删除数组元素永远不会改变现有值的索引;请使用 shiftsplice 来实现这一点。但是,如果任何删除的元素位于数组的末尾,数组的大小将缩小到仍然对 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];