Perl 哈希的创建和引用介绍

2019-10-01 12:43:33王振洲

${$aref}[3] 太难阅读,所以我们这样写 $aref->[3]。

${$href}{red} 写的太笨重, 所以我们这样写 $href->{red}。

如果 $aref 保存的是一个数组的'引用',那么 $aref->[3] 就是这个数组的第四个成员。不要和 $aref[3] 相混淆,这个代表的是一个完全不同的数组的第四个成员,这个迷惑的数组是@aref。 变量 $aref 和 @aref 是完全不相关的,就像 $item 和 @item 一样。

同样的, $href->{'red'} 是哈希'引用' 的变量$href的一部分,甚至这是一个没有名字的哈希。而$href{'red'} 是另一个容易混淆的命名哈希 %href 的一部分。很容易忘记写上符号' ->',如果出现这种情况,当你的程序从一个你不想取数据的数组和哈希中取出了成员,你会得到奇怪的计算结果。

例子
让我们来看一个例子:

首先,记住 [1, 2, 3] 创建了一个匿名数组,包含了 (1, 2, 3),然后返回一个数组的'引用'。

现在想一下:

        @a = ( [1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]
             );
@a 是一个拥有三个成员的数组,每一个成员是另一个数组的'引用'。

$a[1] 是其中的一个'引用'。它指向一个数组,这个数组包含了(4, 5, 6),因为这是一个数组的'引用',使用规则 2 告诉我们可以这样写 $a[1]->[2],用来取得这个数组的第三个成员。  $a[1]->[2] 值是6。 同样的,$a[0]->[1] 值是 2。这里我们就像在使用一个二维数组;你可以是用 $a[ROW]->[COLUMN] 来取得或设置数组中任何一行任何一列中的成员。

这些符号看起来还是有些麻烦,所以还有更加简单的用法:

箭头符号规则
在两个下标之间的箭头是可选的。

我们可以用这个写法$a[1][2]来代替$a[1]->[2];它们是相同的。相对于$a[0]->[1] = 23,我们这样写$a[0][1] = 23;它们也是相同的。

现在它们看起来真的象二维数组了!

你可以发现为什么箭头这么重要。没有它们,我们必须这样写${$a[1]}[2],而不是$a[1][2]。对于三维数组,它们使我们可以简单地写成$x[2][3][5]而不是写成难读的${${$x[2]}[3]}[5]方式。

解决办法
下面是前面提出来的问题的解决方法,就是关于城市和国家名称的重新格式化。

       my %table;
       while (<>) {
        chomp;
         my ($city, $country) = split /, /;
         $table{$country} = [] unless exists $table{$country};