以下文章是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";
}