首页›分类文章›计算机技术›perl 程序开发›perl keys()函数详解

perl keys()函数详解

计算机技术 · perl 程序开发2013-08-200次浏览0 个评论

keys()函数返回指定的 HASH 里的所有键字组成的一个列表。返回的键字在外观上是随机顺序的, 但是这个顺序和 values 或者 each 函数产生的顺序是一样的(假设该散列在不同调用之间没有 被修改),它的一个副作用是重置 HASH 的遍历符。下面是一个(相当呆的)打印你的环境变量的方法:

perl
   @keys = keys %ENV;      # 以同样顺序的键字
   @values = values %ENV;   # 数值
   while (@keys) {
      print pop(@keys), '=', pop(@values), "\n";
   }

你可能更愿意看到键字排序的环境:

perl
   foreach $key (sort keys %ENV) {
      print $key, '=', $ENV{$key}, "\n";
   }

你可以直接对散列的数值排序,但是如果你不把这些数值映射回键字,这么做好象没什么用。要按照数值对散列排序,通常你需要通过提供一个基于键字访问数值的比较函数来对 keys 排序。 下面是一个对散列的数值的降序排序:

perl
   foreach $key (sort {$hash{$b} <=> $hash{$a} } keys %hash) {
      printf "%4d %s\n", $hash{$key}, $key;
   }

在一个与某个相当大的 DBM 文件捆绑的散列上使用 keys 会生成一个相当大的列表,导致你产生一个相当大的进程。这时候你可能更愿意使用 each 函数,它是一个一个地遍历散列,而不会把它们一下子都吞到一个粒度非常大的列表里。
在标量环境里,keys 返回散列中元素的数量(并且重置 each 遍历器)。不过,要从一个捆绑的散列 里获取这样的信息,包括 DBM 文件,Perl 就必须遍历整个散列,所以这样做并不高效。在空环境里 调用 keys 会好一些。
如果用做左值,keys 就增大为给定散列分配的散列桶的数目。(类似于通过给 $#array 赋予 更大的数字预扩展一个数组。)如果你知道某个散列要增长,而且你知道它要增长到多大,那么 预扩展你的散列可以获得效率上的提高。如果你说:

perl
   keys %hash = 1000;

那么 %hash 就会至少有分配给它的 1000 个桶(实际上,你得到 1024 个桶,因为它是圆整为 最近的二的指数)。你不能通过这种方法用 keys 缩小分配的桶的数量(不过如果你不小心这么 做了也不用担心,因为这样的尝试是没有作用的)。甚至你 %hash = (),这些桶也会照样存在。 如果你想在 %hash 仍然在范围里的时候释放它的存储器,那么用 undef %hash。

评论

0

评论加载中…

发表评论

0/2000