我很惊讶地发现keys
函数很适合数组:
keys HASH keys ARRAY keys EXPR
返回一个列表,该列表包含指定哈希的所有键,或者 数组的索引。 (在标量上下文中,返回键的数量或 指数。)
在内存使用,速度等方面使用keys @array
代替0 .. $#array
有什么好处,或者这个功能更多是历史起源的原因?
看到keys @array
支持$[
修改,我猜它是历史性的:
$ perl -Mstrict -wE 'local $[=4; my @array="a".."z"; say join ",", keys @array;'
Use of assignment to $[ is deprecated at -e line 1.
4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29
答案 0 :(得分:4)
each
%哈希返回键和值,each
@array也返回键(索引)和值。
while (my ($idx, $val) = each @array)
{
if ($idx > 0 && $array[$idx-1] eq $val)
{
print "Duplicate indexes: ", $idx-1, "/", $idx, "\n";
}
}
感谢Zaid提出要求,感谢jmcnamara将其提交给perlmonks的CB。我之前没有看到这个 - 我经常在数组中循环,想知道我在做什么索引。这比手动操作在循环外部创建并在内部递增的一些$i
变量更好,因为我预期continue
,redo
等将更好地存活下来。
所以,因为我们现在可以在数组上使用each
,我们需要能够重置该迭代器,因此我们有keys
。
答案 1 :(得分:3)
您提供的链接实际上有一个重要原因,您可以使用/不使用keys
:
作为副作用,调用keys()会重置HASH或ARRAY的内部交互器(参见每个)。特别是,在void上下文中调用keys()会重置迭代器而不会产生其他开销。
这会导致each
重置为数组的开头。如果数组本身支持稀疏数组作为真实数据类型,那么对数组使用keys
和each
可能很重要。
所有这一切,在perl中有如foreach
和join
这样的阵列感知语言结构,我记不起上次使用0..$#array
时。
答案 2 :(得分:2)
我实际上认为你已经回答了自己的问题:它返回数组的有效索引,无论你为$[
设置了什么值。因此,从一般性的角度来看(特别是对于库使用而言),它更受欢迎。
我所拥有的Perl版本(5.10.1)不支持将keys
与数组一起使用,因此不能用于历史原因。
答案 3 :(得分:0)
在你的例子中,你把它们放在一个列表中;所以,在列表上下文中
keys @array
将替换为数组的所有元素
而0 .. $#array
将做同样的事情,但作为数组切片;因此,您可以提及$array[0 .. $#array]
$array[0 .. (some specific index)]