delete EXPR

給定一個指定雜湊元素或切片的表達式,delete 從該雜湊中刪除指定的元素,以便 exists 在該元素上不再傳回 true。將雜湊元素設定為未定義值不會移除其金鑰,但刪除它會;請參閱 exists

在列表內容中,通常傳回已刪除的值或值,或在標量內容中的最後一個元素。傳回清單的長度與參數清單的長度相符:刪除不存在的元素會在它們對應的位置傳回未定義值。自 Perl 5.28 以來,金鑰/值雜湊切片 可以傳遞給 delete,而傳回值是金鑰/值配對清單(從雜湊中刪除的每個項目兩個元素)。

delete 也可以用於陣列和陣列切片,但其行為不那麼直接。儘管 exists 會對已刪除的項目傳回 false,但刪除陣列元素永遠不會變更現有值的索引;請使用 shiftsplice。但是,如果任何已刪除的元素位於陣列的最後,則陣列的大小會縮小到 exists 仍測試為 true 的最高元素的位置,或如果沒有,則縮小到 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 的最後一個運算為集合的元素或切片,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];