|
很少这样做,但可以使用如下的语法在hash 之间拷贝:
%new_hash = %old_hash;
这种运算,Perl 实际做的运算比想象的要多。不像Pascal 或者C 语言,这种操作通常是拷贝一块内存。Perl 的数据结构更
加复杂。这段代码告诉Perl 将%old_hash 展开成key/value 的列表,再将其赋给%new_hash,其将key/value 对一个一个加入
的。
将hash 转变成其它形式更加常见。例如,我们可以将hash 反转:
%inverse_hash = reverse %any_hash;
这会将%any_hash 展开成key/value 对的列表,其列表如(key,value,key,value,key,value,……)。然后, 将其反转,得到
(value,key,value,key,value,key,……)。value 和key 的位置交换了。当将其存放在%inverse_hash ,我们就可以查询对于
%any_hash 来说是value 的字符串,因为现在它对于%inverse_hash 来讲是key 了。查询到的value 对于%any_hash 来讲属于
key。这给我们提供了一种方法:查询“value”( 现在成了key),得到“key”(现在成了value)。
你可能猜测(按照科学的方法,如果你足够聪明)这仅当值也是唯一的情况才能正常工作。否则,我们将得到重复的key,
但key 必须是唯一的。这里有一条规则:最后一次赋值获胜。也就是说,列表中后面的元素将覆盖掉以前的元素(相同key
时)。由于我们并不知道key/value 对的顺序,因此也不能判断哪一对将最终获胜(被使用)。如果想使用这种技术,那你必
须确保之前的值是唯一的◆。如我们在早期的IP address 和hostname 的例子中就可以使用:
◆或者你并不关心重复的情况。例如,反转%family_name(keys 为given name(名),而value 为family names(姓))将很容易判断是否存在此
family name。例如,在反转的hash 中,如果没有key: slate,那我们就能确定在最初的hash 中没有family name:slate。
%ip_address = reverse %host_name;
我们可以查询IP 地址,或者主机名来得到其对应的主机名或者IP 地址。
|
|