Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1637998
  • 博文数量: 126
  • 博客积分: 1541
  • 博客等级: 上尉
  • 技术积分: 1914
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-20 11:14
文章分类

全部博文(126)

文章存档

2014年(21)

2013年(42)

2012年(63)

分类: Python/Ruby

2012-12-05 16:05:49

对hash的遍历,除了keys和values之外,最常用的还是each,如下

while( my ($key, $value) = each %hash )

{

     print "$key => $value\n";

}

但是今天遇到一个问题,遍历两遍时会出现奇怪的现象,后来查文档,发现是each的问题,使用each结合while循环时,要注意如下的情况

while( my ($key, $value) = each %hash )

{

     print "$key => $value\n";

     last if $key eq "specialkey";

}

假设这hash中有一个key为specialkey,则遇到此key之后,就退出循环了。但是假如之后又需要循环遍历这个hash进行查找,即再次使用while each的话,会发现打印输出的结果和上一次不一样,不是从头开始,而是从上次last退出循环的地方继续打印。

perldoc -f each

其中有一句话:

There is a single iterator for each hash, shared by all each, keys, and values function calls in the program; it can be reset by reading all the elements from the hash, or by uating keys HASH or values HASH.

我的理解:即这三个函数都是共用HASH中的一个指针,对keys和values来说,每次都是必然遍历全部HASH,但是对each来说,每次只是移动指针到下一个位置。因此在一个程序中,对同一个HASH,如果在第一个while each中没有遍历完毕就用last退出的话,之后的while each将接着上次的位置继续遍历。如果想当然的以为每次while each都是从头开始,那就会出问题。

阅读(9778) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~