perl陣列硬引用 perl中的引用

2021-10-12 15:43:27 字數 4145 閱讀 5077

為什麼使用引用?

在perl4中,hash表中的value欄位只能是scalar,而不能是list,這對於有些情況是很不方便的,比如有下面的資料:

chicago, usa

frankfurt, germany

berlin, germany

washington, usa

helsinki, finland

new york, usa

我們想要按國家將城市分類,每個國家後面對應城市列表,如果用perl4來做,必須將城市列表組合成字串才行,如果用perl5就可以用引用來做,有了引用,就可以構造複雜的hash結構,就可以用列表作為hash的值了。

如何定義引用

方法一 使用斜線\

定義變數的時候,在變數名前面加個\,就得到了這個變數的乙個引用,比如

#陣列的引用my@array=(1,2,3) ;my$aref=\@array;#雜湊的引用my%hash=("name"=>"zdd","age"=>30,"gender"=>"male") ;my$href=\%hash;#標量的引用my$scalar=1;my$sref=\$scalar;

方法二 匿名引用

方法一不是很常用,最常用的還是匿名引用,方法如下

匿名陣列引用-用定義

$aref=[1,"foo",undef,13];

匿名陣列的元素仍然可以是匿名陣列,所以我們可以用這種方法構造陣列的陣列,可以構造任意維度的陣列。

my $aref = [

[1, 2, 3],

[4, 5, 6],

[7, 8, 9],

匿名雜湊引用-用{}定義

$href=;

使用引用

定義了引用之後,可以使用不同的方法來訪問引用,這裡主要有三種方法。記憶這三種方法有個訣竅,將他們與普通的變數訪問作比較即可。

方法一與普通變數的訪問方法相比,假設原來的變數名是name,則此方法在所有name出現的地方用$name代替,如下

my $scalar = 1 ;

my @array = (1, 2, 3) ;

my %hash = ('zdd' => 30, 'autumn' => 27) ;

my $sref = \$scalar ; #scalar referencemy $aref = \@array ; #array referencemy $href = \%hash ; #hash reference

# 方法一print $$sref, "\n" ;  # 用$sref代替srefprint @$aref, "\n" ;   # 用$aref代替aref

print %$href, "\n" ;   # 用$href代替href

print $$aref[2], "\n" ;

print $$href, "\n" ;

方法二與普通變數的訪問方法相比,假設變數原來的名字是name,則現在用來代替name。

@a@         an arrayreverse@areverse@reversethe array$a[3]      $[3]       an element of the array$a[3]=17; $[3]=17assigning an element

同理,雜湊引用的使用方法如下。

%h%          a hashkeys%hkeys%       get thekeysfrom the hash$h     $      an element of the hash$h=17$=17assigning an element

注意:當{}內部是$var的形式時,{}是可以省略的,也就是說@等價於@$aref,不過初學最好養成使用{}的習慣。

方法三前兩種方法比較繁瑣,這種很簡潔,就是使用箭頭符號->

$aref->  陣列解引用

$href->{}  雜湊解引用

$href->()  子過程解引用

$aref->[0]=3;$href->="autumn";$sref=2;

也可以將引用賦值給其他變數

my$aref1=$aref;my$href1=$href;my$scalar1=$scalar;

解引用總結

my $scalar = 1 ;

my @array = (1, 2, 3) ;

my %hash = ('zdd' => 30, 'autumn' => 27) ;

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, "\n" ;

#方法二print $, "\n" ;

print @, "\n" ;

print %, "\n" ;

print $[2], "\n" ;

print $, "\n" ;

#方法三,不適用於標量print $aref->[0], "\n" ;

print $href->, "\n" ;

陣列的陣列

@a = (

[1, 2, 3],

[4, 5, 6],

[7, 8, 9]

我們知道[1, 2, 3]定義了乙個(1, 2, 3)的匿名引用,所以陣列a實際上包含三個元素,每個元素是乙個引用,該引用指向乙個陣列,所以我們可以用下面的方法來訪問陣列元素(注意,下標從0開始)

$a[1][2]表示第二行第三列元素6,也可以寫成$a[1]->[2],不過很少有人這麼寫。還可以寫成$[2],幾乎沒人這麼寫!

多維陣列的另乙個寫法如下:

my $aref = [1, [2, 3], [4, 5, 6]] ;

print $aref->[0] , "\n" ; #1print $aref->[1][1], "\n" ; #3print $aref->[2][0], "\n" ; #4

這兩者的區別有以下幾點:

前者是真正的陣列,所以定義變數是使用@,後者是指向匿名陣列的引用,所以定義的時候使用$

前者的陣列元素是匿名陣列,而外層陣列則是實體陣列,後者無論元素還是外層陣列都是匿名陣列

前者可以用$a[x][y]的形式訪問,而後者只能用解引用的方式訪問,即$a->[x][y]的形式。

陣列的雜湊

雜湊的陣列

雜湊的雜湊

也就是雜湊表中的每個元素也是乙個雜湊表,比如乙個學生集合組成的雜湊,其key是學生名字(唯一),其值是每個學生的屬性,比如年齡,身高及學號等。

my $student_properties_of = ];

注意:不能使用下面的形式,外層的是不可缺少的。由於=左邊是標量,所以右邊的陣列會被解釋為標量環境,得到的是陣列元素個數,而不是元素本身。但是如果加上就可以了,這樣perl知道這是乙個匿名陣列的賦值。

$aref2 = @;

判斷乙個變數是否是引用

使用ref函式即可,如果變數是引用則返回真,否則返回假。實際上它更智慧型,它會返回引用對應的型別,比如hash或者array。

my $aref1 = [1, 2, 0] ;

print ref $aref1, "\n" ; #輸出 array

if (ref $aref1) {

print "true\n" ; #輸出 true

判斷兩個引用是否指向同乙個目標

可以用eq,這將以字串的形式判斷,也可以使用==

my $aref1 = [1, 2, 0] ;

my $aref2 = $aref1 ;

print $aref1, "\n" ;

print $aref2, "\n" ;

if ($aref1 eq $aref2) {

print "reference equal\n" ;

if($aref1 == $aref2) {

print "reference equal\n" ;

產生如下輸出

array(0x248bec)

array(0x248bec)

reference equal (eq)

reference equal (==)

perl陣列硬引用 Perl陣列和引用使用指導

本文和大家重點討論一下perl陣列和引用的概念,perl中的perl陣列和雜湊表始終是一維的。因此,perl陣列和雜湊表只儲存標量值,不直接存貯perl陣列或其它的複雜資料結構。perl陣列的成員要麼是數 或字串 要麼是引用。一 perl陣列和引用 關於perl語言應該記住的最重要的一點可能是 pe...

perl 中的引用

perl 語言中的引用共分為兩類 宣告引用時只需要在物件的前面加上反斜槓 第一列是陣列的引用 示例 my array 1,2,3 my array ref array 第二種是雜湊的引用 示例 my hash 1,2,3,4 my hash ref hash 通過引用去訪問對應的值,通過 操作符 陣...

Perl入門(三)Perl的陣列

perl陣列的宣告方式 perl使用 符號宣告乙個陣列 array 使用 或 qw 宣告陣列中元素 乙個完整的宣告方式為 array 12,123 abc var 方法一 或者 array qw 12 123 abc 方法二 或者 array 1.10 方法三 perl陣列的訪問 陣列通過下標進行訪...