標籤:style class blog code color get
Perl 中的引用,為什麼要使用引用?
對於熟悉C語言的開發人員來說, 指標這個概念一定不陌生。
Perl 的引用就是指標,可以指向變數、數組、雜湊表甚至子程式。
Perl5中的兩種Perl參考型別為硬Perl引用和符號Perl引用。符號Perl引用含有變數的名字,它對運行時建立變數名並定位很有用,基本上,符號Perl引用就象檔案名稱或UNIX系統中的軟連結。而硬Perl引用則象檔案系統中的永久連結。
Perl4隻允許符號Perl引用,給使用造成一些困難。例如,只允許通過名字對包的符號名雜湊表(名為_main{})建立索引。Perl5則允許資料的硬Perl引用,方便多了。
硬Perl引用跟蹤Perl引用的計數,當其數為零時,Perl自動將被Perl引用的項目釋放,如果該項目是對象,則析構釋放到記憶體池中。Perl本身就是個物件導向的語言,因為Perl中的任何東西都是對象,包和模組使得對象更便於使用。
那在什麼狀況下會使用到引用呢?
在perl4中,hash表中的value欄位只能是scalar,而不能是list,這對於有些情況是很不方便的,比如有下面的資料:
Chicago, USA
Frankfurt, Germany
Berlin, Germany
Washington, USA
Helsinki, Finland
New York, USA
我們想要按國家將城市分類,每個國家後面對應城市列表,如果用perl4來做,必須將城市列表組合成字串才行,如果用perl5就可以用引用來做,有了引用,就可以構造複雜的hash結構,就可以用列表作為hash的值了。
定義引用
知道了引用的作用,那麼如何來定義一個引用呢?
方法1: 使用斜線 \
在變數前面加上一個 \
對於陣列變數的引用:
my @array = (1,2,3);my $arrayref = \@array;
對於雜湊變數的引用
my %hash = ("name"=>"oscar999","age"=>30);my $hashref = \%hash;
對於標量的引用
my $scarlar = 1;my $scarlarfef = \$scarlar;
方法2. 匿名引用 [] 或 {}
匿名引用就是不定義變數,
對於匿名數組來說,直接用中括弧 [] 來定義引用
my $arrayref = [1,2,3];
以上就是定義一個匿名數組。
使用這種方式也可以在匿名數組中套匿名數組
my $arrayref = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]];
匿名雜湊引用用 {} 定義
my $href = {US=>4,CN=>6};
使用引用
定義了引用, 如何使用呢?
方法1: 與普通變數訪問相比, 多加一個 $
這個概念和C 和類似
#定義變數my $scalar = 1 ;my @array = (1, 2, 3) ;my %hash = ("name"=>"oscar999","age"=>30);#定義引用my $sref = \$scalar ; # scalar referencemy $aref = \@array ; # array referencemy $href = \%hash ; # hash reference#使用引用print $$sref, "\n" ; print @$aref, "\n" ; print %$href, "\n" ; print $$aref[2], "\n" ;print $$href{‘name‘}, "\n" ;
方法2 與普通變數訪問相比, 多加一個 $
數組的使用:
@a @{$aref} An array [email protected] reverse @{$aref} Reverse the array $a[3] ${$aref}[3] An element of the array $a[3] =17; ${$aref}[3] =17 Assigning an element
雜湊的使用:
%h %{$href} A hash keys%h keys%{$href} Get the keys from the hash $h{‘red‘} ${$href}{‘red‘} An element of the hash $h{‘red‘} =17 ${$href}{‘red‘} =17 Assigning an element
注意:當{}內部是$var的形式時,{}是可以省略的,也就是說@{$aref}等價於@$aref,不過最好是加上{}。
方法3: 使用箭頭符號 -> 這種用法看起來比較簡潔
$aref->[] 數組解引用
$href->{} 雜湊解引用
$href->() 子過程解引用
看看例子:
$aref->[0] =3 ; $href->{name} ="autumn" ;
前言