給定一個指定雜湊元素或切片的表達式,delete
從該雜湊中刪除指定的元素,以便 exists
在該元素上不再傳回 true。將雜湊元素設定為未定義值不會移除其金鑰,但刪除它會;請參閱 exists
。
在列表內容中,通常傳回已刪除的值或值,或在標量內容中的最後一個元素。傳回清單的長度與參數清單的長度相符:刪除不存在的元素會在它們對應的位置傳回未定義值。自 Perl 5.28 以來,金鑰/值雜湊切片 可以傳遞給 delete
,而傳回值是金鑰/值配對清單(從雜湊中刪除的每個項目兩個元素)。
delete
也可以用於陣列和陣列切片,但其行為不那麼直接。儘管 exists
會對已刪除的項目傳回 false,但刪除陣列元素永遠不會變更現有值的索引;請使用 shift
或 splice
。但是,如果任何已刪除的元素位於陣列的最後,則陣列的大小會縮小到 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];