第六章 散列
1、 散列是一种数据结构,可以包含任意多个值,并以“键”来寻找相应的值;键通常都是字符串,且可以是任意字符串,但彼此间不能相同,对应的值则不受此限制;散列中的元素没有固定顺序,只有“键-值对”的组合;键和值都是任意的标量,但键总是被当作字符串;
2、 访问散列元素使用 $hash{$some_key} 的格式,键是字符串,也可以是任何表达式;散列变量名称亦属于独立的名称空间;对某个已经存在的散列元素赋值会覆盖原有的值,对事先不存的散列元素赋值,散列元素会自动产生;
3、 访问整个散列使用 %some_hash 的格式;散列和列表可以互相转换(如:@any_array = %some_hash,此为“展开”散列,顺序可能会发生变化),因此,对散列赋值等于在列表上下文中赋值,其列表是由“键-值对”构成;
4、 散列可以使用一般赋值语法复制,如:%new_hash = %old_hash ,但不常用;常用的做法是以某种方式转换散列,如建立反序散列可以使用类似:%inverse_hash = reverse %any_hash;
5、 为避免在对散列赋值时难以分辨“键”、“值”的对应关系,可以使用大箭号来代替赋值列表中的任何逗号,当然,其一般用来实现“键=>值”这样的对应;
6、 keys函数会返回当前散列的键列表,values函数会返回当前散列的值列表,当前散列无元素时,二者均返回空列表;新增元素至散列时,可能会重新排序;散列可以当成布尔表达式使用,即如果至少有一组“键-值对”,结果为真,反之为假;
7、 each函数可以遍历整个散列的“键-值对”,返回值为相应的“键-值对”,访问最后一个元素后再一次调用将返回空列表;each函数常用于while循环的条件表达式,此时each函数调用返回给while的值在有可用“键-值对”时为“2”,否则为“0”(条件表达式为标量上下文);
8、 exists函数用来查看某个键是否存在于散列中(无论其是否被赋值),存在,返回“真”,否则为“假”;delete函数用来从散列中移除指定的键及其对应的值;
单一散列元素可以在双引号内进行替换,但不能对类似于 “%hash” 的整个散列替换,因为除了几个指定的转义字符(针对于printf函数,如%s等)外,百分号及其后面的散列名称在双引号内会原样输出;