寫這篇是由於工做遇到一個須要使用列表做爲hash的值的問題,這在Python中是很是簡單而輕鬆的事,以下面這段python程序。html
1 def add_to_index(index, keyword, url): 2 if keyword in index: 3 index[keyword].append(url) 4 else: 5 index[keyword] = [url]
但在Perl中怎麼辦呢?答案是使用引用,一樣輕鬆搞定。python
建立引用數組
1.使用\操做符app
#標量引用 my$scalar=42; my$sref=\$scalar ; # 數組引用 my@array= (1,2,3) ; my$aref=\@array ; #哈希引用 my%hash= ("name"=>"foo","age"=>42,"gender"=>"male") ; my$href=\%hash ; #子程序引用 sub handler {return 1} $coderef = \&handler; #句柄引用 $globref = \*STDOUT;
其中,句柄引用有什麼用?url
2.匿名引用spa
定義一個普通數組: my @a = (1,2,3);scala
定義一個匿名數組引用: my $a = [1,2,3];code
定義一個以匿名數組引用爲元素的數組(實際是二維數組):htm
@a = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
)
其中:$a[1][2]表示第二行第三列元素6.blog
定義一個以匿名數組引用爲元素的數組引用(實際是二維數組的引用):
my $aref = [1, [2, 3], [4, 5, 6]] ; print $aref->[0] , "\n" ; #1 print $aref->[1][1], "\n" ; #3 print $aref->[2][0], "\n" ; #4
注意:
定義一個普通hash: my %h = (a=>1,b=>2,c=>3); #注意是小括號,不是大括號, 不然會報 Reference found where even-sized list expected at ...
定義一個匿名hash引用: my $h = {a=>1, b=>2, c=>3} #注意是大括號
注意: 匿名數組/hash的元素仍然能夠是匿名數組/hash,因此咱們能夠用這種方法構造多維數組/hash:
1 my $a = [ 2 [1, 2, 3], 3 [4, 5, 6], 4 [7, 8, 9], 5 ]
1 my $h= { 2 'a' => { 3 'x' => 1, 4 'y' => 2, 5 'z' => 3, 6 }, 7 8 'b' => { 9 'u' => '4', 10 'v' => '5', 11 'w' => '6', 12 } 13 } ;
使用引用
使用引用並不難,只要把引用的值當作原型的名字使用便可.
好比aref是一個數組引用,對應a是數組, 咱們能夠把$aref總體當作數組的名字a,所以要獲取數組的值即: ${$a}[0], ${$a}[1]
遵循這個原則就很容易了.
1 my $s = 1 ; 2 my @a = (1, 2, 3) ; 3 my %h = ('a' => 1, 'b' => 2) ; 4 5 my $sref = \$s; 6 my $aref = \@a; 7 my $href = \%h; 8 9 print $$sref, "\n" ; 10 print @$aref, "\n" ; 11 print %$href, "\n" ; 12 print $$aref[2], "\n" ; 13 print $$href{'a'}, "\n" ;
注意:當{}內部是$var的形式時,{}是能夠省略的,也就是說@{$aref}等價於@$aref,不過初學最好養成使用{}的習慣。
Reference
http://www.cnblogs.com/softwaretesting/archive/2011/07/26/2117730.html