在列表上下文中,返回一个包含命名哈希所有值的列表。仅在 Perl 5.12 或更高版本中,也会返回数组值的列表;在该版本之前,尝试使用数组参数会导致语法错误。在标量上下文中,返回值的个数。
哈希条目以看似随机的顺序返回。实际的随机顺序特定于给定的哈希;对两个哈希执行完全相同的操作序列可能会导致每个哈希的顺序不同。对哈希的任何插入都可能改变顺序,删除也是如此,但例外是,由 each
或 keys
返回的最新键可以被删除而不会改变顺序。只要给定的哈希没有被修改,你就可以依赖 keys
、values
和 each
重复地返回彼此相同的顺序。有关哈希顺序随机化的原因的详细信息,请参阅 "perlsec 中的算法复杂度攻击"。除了这里提供的保证之外,Perl 哈希算法的具体细节和哈希遍历顺序可能会在任何版本的 Perl 中发生变化。绑定哈希在插入和删除项目时,其顺序变化的行为可能与 Perl 的哈希不同。
作为副作用,调用 values
会在生成值之前重置 HASH 或 ARRAY 的内部迭代器(参见 each
)。特别是,在空上下文调用 values
会重置迭代器,而不会产生其他开销。
除了重置迭代器之外,列表上下文中的 values @array
与简单的 @array
相同。(我们建议你为此使用空上下文 keys @array
,但认为将 values @array
移除需要比保留它更多的文档。)
请注意,值不会被复制,这意味着修改它们将修改哈希的内容。
for (values %hash) { s/foo/bar/g } # modifies %hash values
for (@hash{keys %hash}) { s/foo/bar/g } # same
从 Perl 5.14 开始,一项实验性功能允许 values
接受一个标量表达式。这项实验被认为是不成功的,并且在 Perl 5.24 中被移除。
为了避免混淆运行早期版本的 Perl 的代码潜在用户,并避免出现神秘的语法错误,请将以下内容放在你的文件顶部,以表明你的代码只在最近版本的 Perl 上运行。
use v5.12; # so keys/values/each work on arrays