perl中的引用及復(fù)雜數(shù)據(jù)結(jié)構(gòu)的構(gòu)建
通過perl的引用,我們可以實(shí)現(xiàn)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的構(gòu)建,能很輕松的處理一些復(fù)雜的問題。引用就是將數(shù)據(jù)存為一個(gè)內(nèi)存地址(相當(dāng)于一個(gè)標(biāo)量變量),通過這個(gè)引用標(biāo)量可以獲取引用地址,可以很方便的將列表的引用插入另一個(gè)列表中,構(gòu)建列表中的列表,同樣可以將哈希的引用插入另一個(gè)哈希中。因此,引用可以幫助我們實(shí)現(xiàn)很有意思的東西。今天,在這記錄一下學(xué)習(xí)的過程。
如何創(chuàng)建引用
無論是$、@、%只要在其前面加一個(gè)“\”即可建立地址引用。
#標(biāo)量的引用
my $a = "this is a string\n";
my $refa = \$a;
#列表的引用
my @a = qw/aa bb cc/;
my $refa = \@a;
#哈希的引用
my %hash = ("a"=>12,"b"=>13,"c"=>14);
my $refhash = \%hash;
#匿名引用(不需要構(gòu)建中間變量名)
my $a =[1,2,3]; #通過匿名創(chuàng)建了數(shù)組引用
my $b ={"a"=>12,"b"=>13} #哈希引用
my $c =[];#空的匿名數(shù)組引用
my $d ={};#空的匿名哈希引用 #注意這里是{},和創(chuàng)建哈希()容易記混
如何解引用
對(duì)于三種數(shù)據(jù)結(jié)構(gòu)可以在引用標(biāo)量前加相應(yīng)的數(shù)據(jù)標(biāo)識(shí)符就行,如果要想獲取引用地址真正的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行操作必須要進(jìn)行解引用,對(duì)于perl來說,不會(huì)主動(dòng)會(huì)你解引用。
#標(biāo)量的解引用
my $deref = ${$refa};
#列表的解引用
my @deref = @{$refa};
#哈希的解引用
my %defhash = %{$refhash};
##在實(shí)際編程中還有一個(gè)很重要的箭頭操作符"->"用于解引用,推薦使用這個(gè),是代碼具有很好的可讀性
#獲取列表引用中的數(shù)據(jù)
$refa -> [0] #perl會(huì)根據(jù)箭頭操作符后面的符號(hào)來判定引用數(shù)據(jù)的類型"[ ]"即為數(shù)組引用,"{}"即為哈希引用
#獲取哈希引用的value值
$refhash ->{"key"};
################perl中的復(fù)雜數(shù)據(jù)結(jié)構(gòu)的構(gòu)建#################
通過上面的數(shù)據(jù)結(jié)構(gòu)引用的方法,我們就可以創(chuàng)建有用的數(shù)據(jù)
數(shù)組的數(shù)組
#通過匿名引用構(gòu)建數(shù)組內(nèi)的數(shù)組
my @a = [[1,2,3],[4,5,6],[7,8,9]];
#若要獲得數(shù)組的元素
my $a1 = $a[0]; #實(shí)際上獲得的是[1,2,3]這個(gè)匿名數(shù)組
print "$a1\n"; #打印出來的是一串地址名
print "@{$a1}\n"; #需要解引用才能打印出真實(shí)數(shù)據(jù)
print "${$a[0]}[1]" #打印的[1,2,3]中的元素2
#也可使用箭頭操作符(取出單個(gè)元素)
my $b = $a[0] ->[1]; #使用箭頭操作符就會(huì)使代碼變得很簡(jiǎn)潔
print "$b\n"; #打印的是[1,2,3]數(shù)組中的變量2
#同時(shí)也可進(jìn)行重賦值操作
$a[0] -> [1] = 3; #j將[1,2,3]改成[1,3,3]
#可以通過push函數(shù)對(duì)列表引用操作,(前提需要對(duì)列表解引用)
my @a = (1,2,3,4);
my $refa = \@a;
push @{$refa}, 2; #將2 push到列表引用中
my $b = [4,5,6,7];
push @{$refa},$b; #將列表引用$b,push到數(shù)組@a中
#for對(duì)數(shù)組遍歷
for ($i=0,$i<@a,$i++) {
print "@{$a[$i]}\n";
}
for (0..$#a) {
print "@{$a[$_]}\n";
}
數(shù)組中的哈希
my @a = ({"name"=>"www","math"=>54,"english"=>88},
{"name"=>"http","math"=>88,"english"=>90});
print "$a[0] -> {"name"}\n"#打印出www
my %b = %{$a[0]};
my @value = @b{qw/name math/}; #獲取切片
#可以通過push函數(shù)填充列表
my $b = {"name"=>"haha","math"=>66,"english"=>88};
push @a,$b #哈希引用b追加到數(shù)組中
哈希中的哈希
哈希是我最喜歡的數(shù)據(jù)結(jié)構(gòu)類型,類似于python中的字典,可以通過名字訪問哈希中的數(shù)據(jù)。通過哈希的引用可以創(chuàng)建哈希的嵌套結(jié)構(gòu)。
my %hash = ("a"=>{"name"=>"cc","math"=>67,"english"=>88},
"b"=>{"name"=>"dd","math"=>66,"english"=>89});
#foreach 對(duì)哈希遍歷
foreach $keys(keys %hash) {
print "$keys=>";
foreach ($hash{$keys}) {
print "$hash{$keys} -> {$_}\n";
}
}
#取出哈希的子元素
print "${$hash{"a"}}{"name"}\n" #打印出"name"=>"cc"
print "$hash{"a"} -> {"name"}\n" #與上式等價(jià),箭頭操作符可簡(jiǎn)化代碼
哈希中的數(shù)組
my %hash = ("a" =>[1,2,3,4,5],
"b" =>[6,7,8,9,8]);
#foreach遍歷
foreach $keys(keys %hash) {
print "$keys=>";
print "@{$hash{$keys}}\n";
}
#push元素
push @{$hash{"a"}},6;
print "@{$hash{"a"}}\n"; #打印出a=(1,2,3,4,5,6)
寫得差不多了,哎,坐在高鐵上寫的有點(diǎn)慢,不過還是感覺有意思,學(xué)習(xí)的過程中最重要的部分就是記錄,這樣可以更好的鞏固。后面也要將R的學(xué)習(xí)歷程記錄下來。下次記錄些在生物信息學(xué)perl的一些應(yīng)用。