分类: 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都是从头开始,那就会出问题。