Perl 引用與匿名數組

寫這篇是由於工做遇到一個須要使用列表做爲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

注意:

  • 前者是真正的數組,因此定義變量是使用@,後者是指向匿名數組的引用,因此定義的時候使用$
  • 前者的數組元素是匿名數組,而外層數組則是實體數組,後者不管元素仍是外層數組都是匿名數組
  • 前者能夠用$a[x][y]的形式訪問,然後者只能用解引用的方式訪問,即$a->[x][y]的形式。

 

 定義一個普通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

相關文章
相關標籤/搜索