在列表內容中呼叫,傳回一個包含命名雜湊中所有鍵的列表,或在 Perl 5.12 或更新版本中,傳回陣列的索引。早於 5.12 的 Perl 版本會在您嘗試使用陣列引數時產生語法錯誤。在純量內容中,傳回鍵或索引的數量。
雜湊項目以看似隨機的順序傳回。實際的隨機順序特定於給定的雜湊;對兩個雜湊執行完全相同的運算系列,可能會產生每個雜湊不同的順序。任何插入雜湊的動作都可能變更順序,任何刪除的動作也會變更順序,但 each
或 keys
傳回的最新的金鑰可以刪除,而不變更順序。只要給定的雜湊未修改,您就可以依賴 keys
、values
和 each
重複傳回與彼此相同的順序。有關雜湊順序為何會隨機化的詳細資訊,請參閱 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