以下文章是perl5的读书笔记,原文自http://perldoc.perl.org/perlreftut.html
1. 为什么要用列表的数组元素?
假设有如下的数据
北京, 中国
天津,中国
东京,日本
首尔,韩国
如果存储到列表中,则希望是这样的:
中国 => 北京,天津
日本=>东京
韩国=>首尔
在perl4中,你只能把=>后面的元素当作字符串处理,每次处理时,要把字符串取出,排序,然后再存取.对于perl来讲,这些操作本应该是内至的,现在作到了.
2. 创建一个带有数组元素的列表
1) perl的引用符号 "/"
你可以用符号 "/" 创建一个对数组,列表或者普通变量的引用如
$aref = /@array; #对数组的引用
$href=/%list; #对列表的引用
$scalar=/$var; //对普通变量的引用的
引用可以传递:
$xy = $aref; # $xy 建立的对@array的引用
$p[3] = $href; #$p[3] 建立对%list的引用
$z=$p[3] ;# $z同样建立了对%list的引用
引用和C语言的指针比较相似,不同的是,引用自身带有变量类型.如
print $aref; 得到的结果是 ARRAY(0x275d18)
print $href; 得到的结果是 HASH(0x1830ef4)
2) 用[...]建立对无名数组的引用 ,用{key=>value,...}建立对无名列表的引用
如: $aref = [1,2,"foo",undef,13];
$href={key1=>Val1,key2=>val2};
效果如同
@array = (1,2,"foo",undef,13);
$aref=/@array;
3) 使用引用访问对象
对于数足,可以使用:
@a 等同 @{$aref}
reverse @a reverse @{$aref}
$a[3] ${$aref}[3]
$a[3] = 127; ${$aref}[3] = 17
对于hash表,情况很相似
%h %{$href}
keys %h keys %{$href}
$h{'red'} ${$href}{'red'}
$h{'red'}=7 ${$href}{'red'}=7
也可以用在任何你想用的地方,如
for my $elment(@{$aref}){
}
想c语言的指针一样,perl也可以使用"->"引用其子对象如
${$aref}[3] == $aref->[3]
${$href{red} == $href->{red}
你还可以创建多伪数组
@a = ( [1,2,3],[4,5,6],[7,8,9]);
$a[n] 就是一个对子数组的引用,可以用${$a[n]}[n] 或者$a[n]->[n] 来存取对象
他也支持混合的array和hash混合的现象,如
@a = ( [1,2,3,5],
{a=>'a',b=>'b'}
);
可以用 $a[0]->[1](${$a[0]}[0]) , $a[1]->{a} ( ${a[0]}{a} ) 访问
对于大于两级 的引用"->"是可以省略的,$a[0]->[1] 可写成$a[0][1],${${$a[0]}[1]}[2] 可写成$a[0][1][2];
3 具体的解决方案
回过头看看我们开始的程序应该怎么写:
my %table;
print "input lick /"city,country/". and end input press enter directly/n";
while(<>) {
chomp;
if($_ eq "") {last;}
my ($city,$country) = split /,[ ]*/;
$table{$country} = [] unless exists $table{$country}; #如果不存在,就创建一个空的无记名列表引用
push @{$table{$country}},$city;
}
#输出
foreach $country (sort keys %table) {
print "$country: ";
my @cities = @{$table{$country}};
print join ', ',sort @cities;
print "./n";
}