@cities = @array;
不同的是这里的数组的名字被'引用' {$table{$country}}所替代。符号 @ 告诉Perl去获取整个数组。得到了城市的列表后,我们照样对其进行排序,合并城市名,并打印出来。
第2-7行负责创建数据结构,如下:
while (<>) {
chomp;
my ($city, $country) = split /, /;
$table{$country} = [] unless exists $table{$country};
push @{$table{$country}}, $city;
}
第 2-4 行获取城市和国家的名称。第5行查看这个国家名称是不是已经作为一个键存放在哈希里面了,如果没有,程序就使用符号[] (创建规则 2)创建一个新的、空的匿名数组,同时把一个指向这个匿名数组的'引用'作为健值放到哈希里面去了。
第6行将城市名放到对应的数组里面。$table{$country} 现在保存了一个'引用',它指向所对应的国家的城市的数组。第6行就象
push @array, $city;
不同的是这里的数组名被{$table{$country}}所替代。 命令 push 将城市名加到这个'引用'指向数组的最后。
这里有一个要点被我忽略了。第5行是不需要的。我们可以取掉它。
while (<>) {
chomp;
my ($city, $country) = split /, /;
#### $table{$country} = [] unless exists $table{$country};
push @{$table{$country}}, $city;
}
如果在哈希 %table 中已经有这个国家名 $country的记录,那么,加不加第5行没有任何区别。第6行会自己定位到$table{$country}这个'引用'指向的数组,把值 $city 放到数组中去。但是如果在%table中没有那个键,比如Greece,那么它会怎么办呢?
这是Perl,它会自己准确地完成工作。你想把一个Athens赋值给一个不存在地数组,那么Perl会帮助你创建一个新的、空的匿名数组,将它放到哈希%table里面去,然后把值 Athens 放到这个数组中。这个被称为'自动生成' --让事物自己自动产生出来。 Perl 发现在哈希里面没有这个键,就自动地创建了一个新的哈希记录。 Perl 发现你想要使用数组作为哈希的健值,它就自动创建一个匿名的空数组,并将指向这个数组的'引用'放到那个哈希中去。一般, Perl 创建的数组只有一个成员大小,用于保存这个新的城市名。
其他集锦









