使用密钥@array而不是0 .. $#array有什么好处吗?

时间:2011-08-08 14:14:06

标签: perl

我很惊讶地发现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

4 个答案:

答案 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变量更好,因为我预期continueredo等将更好地存活下来。

所以,因为我们现在可以在数组上使用each,我们需要能够重置该迭代器,因此我们有keys

答案 1 :(得分:3)

您提供的链接实际上有一个重要原因,您可以使用/不使用keys

  

作为副作用,调用keys()会重置HASH或ARRAY的内部交互器(参见每个)。特别是,在void上下文中调用keys()会重置迭代器而不会产生其他开销。

这会导致each重置为数组的开头。如果数组本身支持稀疏数组作为真实数据类型,那么对数组使用keyseach可能很重要。

所有这一切,在perl中有如foreachjoin这样的阵列感知语言结构,我记不起上次使用0..$#array时。

答案 2 :(得分:2)

我实际上认为你已经回答了自己的问题:它返回数组的有效索引,无论你为$[设置了什么值。因此,从一般性的角度来看(特别是对于库使用而言),它更受欢迎。

我所拥有的Perl版本(5.10.1)不支持将keys与数组一起使用,因此不能用于历史原因。

答案 3 :(得分:0)

在你的例子中,你把它们放在一个列表中;所以,在列表上下文中

keys @array将替换为数组的所有元素 而0 .. $#array将做同样的事情,但作为数组切片;因此,您可以提及$array[0 .. $#array]

而不是$array[0 .. (some specific index)]