keys HASH
keys ARRAY

在列表上下文中调用时,返回一个包含命名哈希中所有键的列表,或者在 Perl 5.12 或更高版本中,仅返回数组的索引。在 Perl 5.12 之前的版本中,如果尝试使用数组参数,将产生语法错误。在标量上下文中,返回键或索引的数量。

哈希条目以看似随机的顺序返回。实际的随机顺序特定于给定的哈希;对两个哈希执行完全相同的操作序列可能会导致每个哈希的顺序不同。对哈希的任何插入都可能改变顺序,删除也是如此,唯一的例外是,由 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