免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Perl解除引用:從引用還原到數(shù)據(jù)對象

https://www.cnblogs.com/f-ck-need-u/p/9710562.html

undefined

轉(zhuǎn)載請務(wù)必在文章最開頭標(biāo)明原文地址
本文原創(chuàng)地址:駿馬金龍https://www.cnblogs.com/f-ck-need-u/p/9710562.html

本人博客搬家:駿馬金龍www.junmajinlong.com

使用引用可以指向數(shù)據(jù)對象,這似乎很簡單。

12345@name1=qw(longshuai wugui);@name2=qw(xiaofang tuner);$ref_name=\@name1;push @name2,$ref_name;print "@name2";   # 輸出:xiaofang tuner ARRAY(0xNAME1)

但如果想通過引用的方式取出數(shù)據(jù)對象的值呢,就像上面的print語句中,想要輸出@name2中包含的@name1的元素,而不是它的地址空間。這需要解除引用(dereference),將$ref_name引用還原為數(shù)據(jù)對象qw(longshuai wugui)

前方預(yù)警:dereference雖然不難,但初學(xué)之時(shí),比較燒腦,比較眼暈

解除數(shù)組的引用

在解釋引用解除之前,有必要先解釋下引用符號和數(shù)據(jù)對象的名稱。

創(chuàng)建一個(gè)@name=qw(value1 value2 value3)的數(shù)組,這個(gè)數(shù)組初始化時(shí),數(shù)組名為name,它是這個(gè)列表數(shù)據(jù)對象的第一個(gè)引用(注意,數(shù)組名是引用),引用方式為@符號+數(shù)組名name,即@name。實(shí)際上,真正規(guī)范的引用方式為@{name}。

因此,當(dāng)使用引用變量的方式引用數(shù)據(jù)對象時(shí),只需把數(shù)組名稱換成引用變量的名稱即可(它們是等價(jià)的,都是對數(shù)據(jù)對象的引用),再加上@符號即可,因?yàn)閿?shù)組名稱和引用變量的名稱都是指向數(shù)據(jù)對象的名稱。

例如,將@name的引用賦值給一個(gè)引用變量$ref_name后(即$ref_name=\@name),就可以使用@$ref_name的方式來表示解除引用,它和@name是等價(jià)的關(guān)系。

以下幾種引用方式絕大多數(shù)時(shí)候是等價(jià)的,可以用來做參考、對應(yīng)。其實(shí)很好理解,只要把原本的對象名稱,替換成引用變量的名稱即可。

123     @{name}    --> @{$ref_name}     @{ name }  --> @{ $ref_name }     @name      --> @$ref_name

如果引用變量的名稱有特殊符號,例如以$符號作為變量名的開頭符號,則不能省略大括號。當(dāng)然,這種情況基本不會出現(xiàn),因?yàn)椴环厦?guī)范,沒人會自找麻煩。

例如:

123456789#!/usr/bin/perluse 5.010;@name=qw(longshuai wugui);$ref_name=\@name;say "@{$ref_name}";say "@{ $ref_name }";say "@$ref_name";

解除hash的引用

同理,解除hash的引用同解除數(shù)組引用的方式一樣,使用引用符號%+引用的名稱即可。

例如,創(chuàng)建一個(gè)hash:%myhash,其中myhash是hash數(shù)據(jù)對象的名稱,%是hash的引用符號。創(chuàng)建一個(gè)hash的引用變量$ref_myhash=\%myhash,那么引用變量對應(yīng)的是hash的名稱myhash,所以通過引用變量名來解除hash引用時(shí):%$ref_myhash即可。

以下是幾種等價(jià)的引用方式:

123     %{name}    --> %{$ref_name}     %{ name }  --> %{ $ref_name }     %name      --> %$ref_name

例如:

12345678910111213#!/usr/bin/perluse 5.010;%myhash=(    longshuai => "18012345678",    xiaofang  => "17012345678",    wugui     => "16012345678",    tuner     => "15012345678");$ref_myhash =\%myhash;say %$ref_myhash;

解除引用:取數(shù)組、hash中的元素(1)

對于普通的數(shù)組和hash,取得它們數(shù)據(jù)對象中的元素方式為:

12345$arr_name[1]            # 取得數(shù)組中的第二個(gè)元素${arr_name}[1]          # 取得數(shù)組中的第二個(gè)元素$hash_name{'mykey'}     # 取得hash中key為'mykey'的value${hash_name}{'mykey'}   # 取得hash中key為'mykey'的value

那么使用引用的方式來獲取數(shù)組、hash中的元素時(shí),方式是一樣的,只需將引用變量替換為對應(yīng)的數(shù)據(jù)對象名稱即可。

例如:

123456789# 數(shù)組元素的引用${name}[1]   -> ${$ref_name}[1]${ name }[1] -> ${ $ref_name }[1]$name[1]     -> $$ref_name[1]# hash元素的引用${myhash}{'wugui'}    -> ${$ref_myhash}{'wugui'}${ myhash }{'wugui'}  -> $ {$ref_myhash }{'wugui'}$myhash{'wugui'}      -> $$ref_myhash{'wugui'}

例如:

1234567891011121314151617181920212223#!/usr/bin/perluse 5.010;# 取數(shù)組的元素@name=qw(longshuai wugui);$ref_name=\@name;say "${$ref_name}[1]";say "${ $ref_name }[1]";say "$$ref_name[1]";# 取hash的元素%myhash=(    longshuai => "18012345678",    xiaofang  => "17012345678",    wugui     => "16012345678",    tuner     => "15012345678");$ref_myhash =\%myhash;say "${$ref_myhash}{'wugui'}";say "${ $ref_myhash }{'wugui'}";say "$$ref_myhash{'wugui'}";

解除引用:取數(shù)組、hash中的元素(2)

除了上面的介紹的取元素方法,對于引用變量,還支持更簡潔的"瘦箭頭"指向法:只需使用引用變量名->元素索引即可。注意,箭頭兩邊必須不能有空格。

12$ref_name->[1]$ref_myhash->{'mykey'}

如此一來,取元素的寫法變得簡潔易讀,且可以規(guī)范化,也不會再出現(xiàn)一大堆容易讓人疑惑的符號。當(dāng)然,到目前為止都只是簡單的引用方式,稍后介紹如何取復(fù)雜數(shù)據(jù)結(jié)構(gòu)的元素時(shí),將會看到不用箭頭的方式取數(shù)據(jù)將非常傷眼睛。

關(guān)于瘦箭頭取元素的用法,給個(gè)簡單的示例:

123456789101112131415#!/usr/bin/perluse 5.010;@name=qw(longshuai wugui);$ref_name=\@name;say "$ref_name->[0]";%myhash=(    longshuai => "18012345678",    xiaofang  => "17012345678",    wugui     => "16012345678",    tuner     => "15012345678");$ref_myhash =\%myhash;say "$ref_myhash->{'wugui'}";

取復(fù)雜數(shù)據(jù)結(jié)構(gòu)中的元素

對于復(fù)雜數(shù)據(jù)結(jié)構(gòu),想要取它的元素并非那么容易。例如,hash的value中有數(shù)組作為元素,該數(shù)組元素中又有數(shù)組的時(shí)候。

CPAN::Config的一部分內(nèi)容為例:

12345678910111213141516171819202122232425#!/usr/bin/perluse 5.010;%Config = (           'auto_commit' => '0',           'build_dir' => '/home/fairy/.cpan/build',           'bzip2' => '/bin/bzip2',           'urllist' => [                          'http://cpan.metacpan.org/',                          \@my_urllist     # 將數(shù)組my_urllist作為元素                        ],           'wget' => '/usr/bin/wget',          );$ref_Config=\%Config;@my_urllist=('http://mirrors.aliyun.com/CPAN/',          'https://mirrors.tuna.tsinghua.edu.cn/CPAN/',          'https://mirrors.163.com/cpan/',          \@more_urllist       # 將數(shù)組more_urllist引用作為元素         );@more_urllist=qw(http://mirrors.shu.edu.cn/CPAN/                 http://mirror.lzu.edu.cn/CPAN/                );

以下是使用原始取得more_urllist數(shù)組中第2個(gè)元素的方式:

1234say "${$ref_Config}{'urllist'}";          # 取得key=urllist對應(yīng)的value:數(shù)組say "${$ref_Config}{'urllist'}[1]";       # 取得urllist數(shù)組中第二個(gè)元素:\@my_urllist引用say "${$ref_Config}{'urllist'}[1][3]";    # 取得my_urllist數(shù)組中第4個(gè)元素:\@more_urllist引用say "${$ref_Config}{'urllist'}[1][3][1]"; # 取得more_urllist數(shù)組中第2個(gè)元素

其實(shí)上面的寫法不是完全規(guī)范寫法,因?yàn)槊看稳〉靡煤?,都沒有對應(yīng)于進(jìn)行${$REF}的規(guī)范化。以下是與上面完全對應(yīng)的規(guī)范寫法:

1234say "${$ref_Config}{'urllist'}";say "${$ref_Config}{'urllist'}[1]";        # 取得引用say "${${$ref_Config}{'urllist'}[1]}[3]";  # 再次取得引用say "${${${$ref_Config}{'urllist'}[1]}[3]}[1]";  # 最終取得元素

啊,我的眼睛,受不了,受不了。

如果使用瘦箭頭引用方式,則更簡潔易讀:

1234say "$ref_Config->{'urllist'}";say "$ref_Config->{'urllist'}->[1]";say "$ref_Config->{'urllist'}->[1]->[3]";say "$ref_Config->{'urllist'}->[1]->[3]->[1]";

各元素之間的瘦箭頭可以省略(引用變量名稱和元素之間的箭頭必須不能省略)。

1234say "$ref_Config->{'urllist'}";say "$ref_Config->{'urllist'}[1]";say "$ref_Config->{'urllist'}[1][3]";say "$ref_Config->{'urllist'}[1][3][1]";

最后需要特別說明的是,當(dāng)將復(fù)雜數(shù)據(jù)結(jié)構(gòu)的引用當(dāng)作子程序的參數(shù)傳給@_時(shí),甚至是@_的一部分時(shí),要特別小心地寫,一個(gè)不小心就錯(cuò)了。

例如,子程序傳遞的參數(shù)形式如下:

mysub('aaa',\%Config)

那么要在子程序內(nèi)部取得more_urllist中的第二個(gè)元素,子程序中取元素相關(guān)的代碼大致如下:

123my $first_arg = shift @_;say "${$_[0]}{'urllist'}";           # 等價(jià)于:$_[0]->{'urllist'}say "${$_[0]}{'urllist'}[1][3][1]";  # 等價(jià)于:$_[0]->{'urllist'}[1][3][1]

只需搞明白,@_中的元素使用$_[N]獲取,而$_[N]獲取到的可能是以一個(gè)引用,所以將其當(dāng)作引用變量名即可。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
基于Web-Harvest精確采集互聯(lián)網(wǎng)的數(shù)據(jù) - 漫步人生 - 51CTO技術(shù)博客
Javascript開發(fā)經(jīng)驗(yàn)談(轉(zhuǎn))
C/C++ atoi函數(shù) - C語言零基礎(chǔ)入門教程
解析Perl中的小箭頭(
MyHash校驗(yàn)工具 v1.4.7 最新正式版綠色版 | 愛在靈靈久博客
數(shù)據(jù)庫|Flask+Redis實(shí)現(xiàn)登錄權(quán)限管理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服