keys HASH
keys ARRAY

在列表內容中呼叫,傳回一個包含命名雜湊中所有鍵的列表,或在 Perl 5.12 或更新版本中,傳回陣列的索引。早於 5.12 的 Perl 版本會在您嘗試使用陣列引數時產生語法錯誤。在純量內容中,傳回鍵或索引的數量。

雜湊項目以看似隨機的順序傳回。實際的隨機順序特定於給定的雜湊;對兩個雜湊執行完全相同的運算系列,可能會產生每個雜湊不同的順序。任何插入雜湊的動作都可能變更順序,任何刪除的動作也會變更順序,但 eachkeys 傳回的最新的金鑰可以刪除,而不變更順序。只要給定的雜湊未修改,您就可以依賴 keysvalueseach 重複傳回與彼此相同的順序。有關雜湊順序為何會隨機化的詳細資訊,請參閱 perlsec 中的「演算法複雜度攻擊」。除了這裡提供的保證之外,Perl 的雜湊演算法和雜湊遍歷順序的確切詳細資訊可能會在任何 Perl 版本中變更。已繫結的雜湊在項目插入和刪除時順序變更的行為可能與 Perl 的雜湊不同。

作為副作用,呼叫 keys 會在產生金鑰之前重設 HASH 或 ARRAY 的內部反覆運算器(請參閱 each)。特別是,在無效的內容中呼叫 keys 會重設反覆運算器,而不會產生其他負擔。

這是列印您的環境的另一種方法

my @keys = keys %ENV;
my @values = values %ENV;
while (@keys) {
    print pop(@keys), '=', pop(@values), "\n";
}

或依據金鑰排序如何

foreach my $key (sort(keys %ENV)) {
    print $key, '=', $ENV{$key}, "\n";
}

傳回的值是雜湊中原始金鑰的複本,因此修改它們不會影響原始雜湊。比較 values

若要依據值排序雜湊,您需要使用 sort 函數。以下是依據值對雜湊進行遞減數字排序

foreach my $key (sort { $hash{$b} <=> $hash{$a} } keys %hash) {
    printf "%4d %s\n", $hash{$key}, $key;
}

用作左值時,keys 允許您增加為給定雜湊配置的雜湊儲存區數量。如果您知道雜湊會變大,這可以讓您獲得一定的效率。(這類似於透過將較大的數字指定給 $#array 來預先擴充陣列。)如果您說

keys %hash = 200;

那麼 %hash 將至少為它配置 200 個儲存區——實際上是 256 個,因為它會向上捨入到下一個 2 的次方。即使您執行 %hash = (),這些儲存區也會保留,如果您要在 %hash 仍然在作用範圍內時釋放儲存空間,請使用 undef %hash。您無法使用 keys 以這種方式縮減為雜湊配置的儲存區數量(但您不必擔心意外執行此動作,因為嘗試執行此動作不會產生任何效果)。在左值內容中,keys @array 是語法錯誤。

從 Perl 5.14 開始,一個實驗性功能允許 keys 採用純量運算式。此實驗被視為不成功,並已從 Perl 5.24 中移除。

為避免讓執行較早版本 Perl 的程式碼潛在使用者感到困惑,並產生神秘的語法錯誤,請將此類內容放在檔案的頂端,以表示您的程式碼只能在較新版本的 Perl 上執行

use v5.12;	# so keys/values/each work on arrays

另請參閱 eachvaluessort