亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Perl > 正文

perl引用的相關知識分享

2020-10-31 15:18:49
字體:
來源:轉載
供稿:網友

為何使用引用?

在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= { APR =>4, AUG =>8 };

使用引用

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

方法一

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

復制代碼 代碼如下:

my $scalar = 1 ;
my @array = (1, 2, 3) ;
my %hash = ('zdd' => 30, 'autumn' => 27) ;
my $sref = /$scalar ;   # scalar reference
my $aref = /@array ;    # array reference
my $href = /%hash ;     # hash reference

# 方法一

復制代碼 代碼如下:

print $$sref, "/n" ;  # 用$sref代替sref
print @$aref, "/n" ;   # 用$aref代替aref
print %$href, "/n" ;   # 用$href代替href
print $$aref[2], "/n" ;
print $$href{'zdd'}, "/n" ;

#方法二
復制代碼 代碼如下:

#與普通變量的訪問方法相比,假設變量原來的名字是name,則現在用{$name}來代替name。
@a        @{$aref}         An array
   reverse@a  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,不過初學最好養成使用{}的習慣。

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

復制代碼 代碼如下:

$aref->[]  數組解引用
$href->{}  哈希解引用
$href->()  子過程解引用
$aref->[0] =3 ;
$href->{name} ="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 reference
my $aref = /@array ;    # array reference
my $href = /%hash ;     # hash reference
# 方法一
print $$sref, "/n" ;
print @$aref, "/n" ;
print %$href, "/n" ;
print $$aref[2], "/n" ;
print $$href{'zdd'}, "/n" ;
# 方法二
print ${$sref}, "/n" ;
print @{$aref}, "/n" ;
print %{$href}, "/n" ;
print ${$aref}[2], "/n" ;
print ${$href}{'zdd'}, "/n" ;
# 方法三,不適用于標量
print $aref->[0], "/n" ;
print $href->{'zdd'}, "/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],不過很少有人這么寫。還可以寫成${$a[1]}[2],幾乎沒人這么寫!

多維數組的另一個寫法如下:

復制代碼 代碼如下:

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

這兩者的區別有以下幾點:
1)、前者是真正的數組,所以定義變量是使用@,后者是指向匿名數組的引用,所以定義的時候使用$
2)、前者的數組元素是匿名數組,而外層數組則是實體數組,后者無論元素還是外層數組都是匿名數組
3)、前者可以用$a[x][y]的形式訪問,而后者只能用解引用的方式訪問,即$a->[x][y]的形式。

數組的哈希,哈希的數組,哈希的哈希

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

復制代碼 代碼如下:

my $student_properties_of = {
    'zdd' => {
        'age' => 30,
        'hight' => 170,
        'id' => '001',
    },
    'autumn' => {
        'age' => 27,
        'hight' => 165,
        'id' => '002',
    }
} ;

引用的賦值

$aref2 = $aref1; 將使得$aref2和$aref1指向同一個數組,如果想將$aref1指向的數組拷貝一份給$aref2的話,使用下面的方法,[]里面對數組進行解引用,而[]以解引用后的數組為內容生成了一個新的匿名數組,又賦值給$aref2。
$aref2 = [@{$aref1}];

注意:不能使用下面的形式,外層的[]是不可缺少的。由于=左邊是標量,所以右邊的數組會被解釋為標量環境,得到的是數組元素個數,而不是元素本身。但是如果加上[]就可以了,這樣perl知道這是一個匿名數組的賦值。
$aref2 = @{$aref1};

判斷一個變量是否是引用

使用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 (==)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品中文字幕av| 欧美精品激情blacked18| 欧美大片大片在线播放| 国产亚洲精品久久久优势| 国产精品jizz在线观看麻豆| 亚洲自拍另类欧美丝袜| 亚洲午夜未满十八勿入免费观看全集| 国产视频久久久久久久| 久久精品久久久久久国产 免费| 亚洲视频在线视频| 97人人模人人爽人人喊中文字| 久久久亚洲影院你懂的| 亚洲美女又黄又爽在线观看| 亚洲福利视频网站| 日韩美女毛茸茸| 精品国内亚洲在观看18黄| 91av在线免费观看视频| 国产一区二区三区在线| 国产精品自产拍在线观看中文| 久久伊人精品一区二区三区| 亚洲男人天堂久| 欧美高清性猛交| 久久久亚洲天堂| 97视频网站入口| 久久中文字幕在线| 精品色蜜蜜精品视频在线观看| 亚洲美女性视频| 国产精品一区二区三区免费视频| 成人在线免费观看视视频| 中文字幕亚洲情99在线| 91成人福利在线| 亚洲成人免费网站| 中文字幕亚洲字幕| 欧美壮男野外gaytube| 国产成人aa精品一区在线播放| 欧美高清在线观看| 亚洲欧美日韩第一区| 亚洲国产精品va在线| 亚洲精品久久视频| 日韩欧美国产免费播放| 国产这里只有精品| 久久久www成人免费精品| 日韩av在线导航| 欧美精品国产精品日韩精品| 国产精品日韩欧美大师| 国产精品一区av| 久久精品久久久久久国产 免费| 91精品久久久久久久久青青| 亚洲国产第一页| 成人激情视频免费在线| 精品视频在线播放色网色视频| 国产精品亚洲片夜色在线| 欧美自拍视频在线观看| 亚洲一级黄色片| 亚洲最新在线视频| 中文字幕亚洲欧美| 美女精品久久久| 亚洲人成五月天| 亚洲一级一级97网| 国产在线视频2019最新视频| 日韩av电影在线免费播放| 久久精品久久久久电影| 91丨九色丨国产在线| 国产精品久久久久久久久久久不卡| 亚洲国产精品久久久久秋霞蜜臀| 亚洲国产欧美精品| 搡老女人一区二区三区视频tv| 亚洲国产成人久久综合一区| 日韩精品免费看| 超碰97人人做人人爱少妇| 日韩在线免费观看视频| 91久久精品国产| 国内精品久久久久久影视8| 777午夜精品福利在线观看| 66m—66摸成人免费视频| 亚洲国产精品系列| 国内揄拍国内精品| 69精品小视频| 亚洲毛片一区二区| 国模gogo一区二区大胆私拍| 国产精品成人va在线观看| 久久精品国产亚洲7777| 国产精品第8页| 国产精品国产亚洲伊人久久| 色青青草原桃花久久综合| 在线看片第一页欧美| 91精品国产自产在线老师啪| 久久国产精彩视频| 日韩综合中文字幕| 一区二区欧美亚洲| 91精品视频免费看| 91精品在线看| 久久影院免费观看| 亚洲精品成人久久久| 国产精品白丝av嫩草影院| 2019精品视频| 国产精品美女主播在线观看纯欲| 欧美性猛交xxxx免费看| 欧美午夜久久久| 国产视频精品va久久久久久| 91国产精品91| 精品综合久久久久久97| 精品免费在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩**中文字幕毛片| 亚洲成人亚洲激情| 国产极品jizzhd欧美| 深夜成人在线观看| 91wwwcom在线观看| 欧美人在线观看| 亚洲国产精品久久久久| 狠狠久久亚洲欧美专区| 91精品视频网站| 在线国产精品播放| 亚洲视频第一页| 亚洲精品电影网站| 成人精品视频99在线观看免费| 国产精品白嫩初高中害羞小美女| 欧美极品少妇全裸体| 美女av一区二区| 亚洲黄页网在线观看| 俺去啦;欧美日韩| 欧洲亚洲妇女av| 日韩精品免费电影| 亚洲美女视频网| 欧美性高潮在线| 国产丝袜一区二区三区| 国产精品一区二区在线| 国产精品视频xxxx| 热久久美女精品天天吊色| 国内精品视频一区| 色yeye香蕉凹凸一区二区av| 久久免费观看视频| 国产精品久久久久久av| 日韩精品在线影院| 亚洲欧洲日产国码av系列天堂| 91在线视频成人| 成人免费观看49www在线观看| 黄色成人av在线| 亚洲奶大毛多的老太婆| 欧美国产日韩中文字幕在线| 深夜福利91大全| 少妇高潮久久久久久潘金莲| 久久久久久久久电影| 日本国产一区二区三区| 亚洲自拍偷拍一区| 欧美一级视频一区二区| 久久久久久999| 久久99久久99精品免观看粉嫩| 欧美视频在线观看 亚洲欧| 在线视频日本亚洲性| 国产成人精品最新| 国产97在线亚洲| 色老头一区二区三区| 日韩在线免费观看视频| 精品国产一区久久久| 欧美最猛性xxxxx亚洲精品| 亚洲第一网站男人都懂| 欧美激情喷水视频| 欧美理论在线观看| 亚洲aaa激情| 国产精品久久99久久| 国产美女精品免费电影| 国模视频一区二区三区|