Perl語(yǔ)言程序設(shè)計(jì):第2章 列表和數(shù)組_第1頁(yè)
Perl語(yǔ)言程序設(shè)計(jì):第2章 列表和數(shù)組_第2頁(yè)
Perl語(yǔ)言程序設(shè)計(jì):第2章 列表和數(shù)組_第3頁(yè)
Perl語(yǔ)言程序設(shè)計(jì):第2章 列表和數(shù)組_第4頁(yè)
Perl語(yǔ)言程序設(shè)計(jì):第2章 列表和數(shù)組_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第二章列表和數(shù)組列表是標(biāo)量值的有序集,數(shù)組是用于存放列表的變量。每一個(gè)列表元素對(duì)應(yīng)相應(yīng)的數(shù)組元素,數(shù)組可以利用其索引查看每個(gè)元素的標(biāo)量值。列表與數(shù)組的定義列表的形式列表元素包含在小括號(hào)()中,各元素用逗號(hào)隔開,可為數(shù)字、字符串、變量、表達(dá)式、undef值等同類型或不同類型的標(biāo)量值。

()

(“hello”,”world”)

print(1,2,3,4); #輸出1234

(‘a(chǎn)’,1,1.34,“hello,$name”) #被替換為$name存放的標(biāo)量值

(1,2,3,) #最后一個(gè)逗號(hào)被忽略 (1..100) #包含從1到100共100個(gè)元素 (1.7..5.7) #最小值和最大值換為整數(shù) (“aa”..“ad”) #等于("aa","ab","ac","ad") ($m..$n) #由$m和$n的值決定

(1,$i+$j)qw(quotedword)簡(jiǎn)寫qw操作把各元素放置于成對(duì)的界定符內(nèi),并用空格將其分開,Perl會(huì)把所有元素均視為單引號(hào)字符串 格式:qw界定符

元素1元素2……元素n界定符 如:qw/fredbarneybettywilmadino/

qw/1$astrbaby/#$a是變量名,還是值?界定符可以選用任何標(biāo)點(diǎn)符號(hào),也可以使用成對(duì)的符號(hào)。 如:qw#fredbarneybettywilmadino#

qw{fredbarneybettywilmadino}

qw(1$astrbaby)

qw[1$astrbaby]列表操作列表為標(biāo)量值的集合,因此可將其賦值給標(biāo)量變量的集合 #!/usr/bin/perl ($fred,$barney,$dino)=("flintstone","rubble",undef); print"\$fred=$fred\n"; print"\$barney=$barney\n"; print"\$dino=$dino\n";

($fred,$barney,$dino)=qw(flintstonerubbleundef); print"\$fred=$fred\n"; print"\$barney=$barney\n"; print"\$dino=$dino\n";當(dāng)左邊列表中的變量數(shù)目<右邊列表中的值數(shù)目,那么右邊列表中多余的值將被舍棄

($first_name,$last_name)=qw(JackTomBrian);

返回的結(jié)果為: $first_name="Jack",$last_name="Tom"當(dāng)左邊列表中的變量數(shù)目>右邊列表中的值數(shù)目,那么左邊列表中剩余的變量將被賦予undef值

($first_name,$middle_name,$last_name)=qw(LarryWall);

返回的結(jié)果為:

$first_name="Larry",$middle_name="Wall",$last_name=undef互換兩個(gè)變量的值 #!/usr/bin/perl $first_name="Brian"; $last_name="Ruan"; print"CHANGE-before:\$first_name=$first_name\n"; print"CHANGE-before:\$last_name=$last_name\n"; ($first_name,$last_name)=($last_name,$first_name); print"CHANGE-after:\$first_name=$first_name\n"; print"CHANGE-after:\$last_name=$last_name\n";

問題:與C語(yǔ)言的差別在哪?數(shù)組形式數(shù)組形式

任何數(shù)組都是以@為標(biāo)識(shí),命名方式同簡(jiǎn)單變量 例如:@a=(1,2,3);#@a與$a是不同的變量

注意:數(shù)組的初始值為空()元素形式 數(shù)組的元素為簡(jiǎn)單變量,以$開頭。后面的變量名同數(shù)

組名,索引從0開始。 例如:$a[0],$name[1],$gene[3]練習(xí):定義核酸數(shù)組定義核酸數(shù)組解答1:@bases=('A','C','G','T');print"Herearethearrayelements:";print"\nFirstelement:";print$bases[0];print"\nSecondelement:";print$bases[1];print"\nThirdelement:";print$bases[2];print"\nFourthelement:";print$bases[3];解答2:@bases=('A','C','G','T');@order=qw(FirstSecondThirdFourth);print"Herearethearrayelements:";$i=0;while($i<4){print"\n$order[$i]element:$bases[$i]";$i++;}

#!/usr/bin/perl

$number=2.71828;

@food;

for($i=0;$i<5;$i++){

$food[$i]=$i;

}

print"$food[$number+1]\n”說明:任何求值能得到數(shù)字的表達(dá)式都可以用作下標(biāo)數(shù)組索引的一個(gè)例子數(shù)組賦值方式@a=(1,2,3,4);

#標(biāo)準(zhǔn)的列表賦值@a=(1..4);#@a為含元素1,2,3,4的數(shù)組@b=(1,2,3,4),@a=@b;

#數(shù)組復(fù)制,C中可以這樣嗎?@b=(2,3),@a=(1,@b,4);

#數(shù)組內(nèi)插@a=(1,2,3,4)@b=(@odd,@even);@b=(‘a(chǎn)’)x4;

#@b=(‘a(chǎn)’,

‘a(chǎn)’,

‘a(chǎn)’,

‘a(chǎn)’)@rocks=qw(bedrock$namelava);

#返回的結(jié)果為:rocks[0]="bedrock",rocks[1]='$name'(注意:不是變量$name的值),rocks[2]="lava“@city=();@rocks=("bedrock",@city,"lava");

#數(shù)組rocks的元素為:"bedrock","lava",空列表被去除(隱示聲名undef)@city=(undef);@rocks=("bedrock",@city,"lava");

#數(shù)組rocks的元素為:"bedrock",undef,"lava“@rocks=("bedrock",undef,"lava");

#數(shù)組rocks的元素為:"bedrock",undef,"lava"(顯示聲明undef)數(shù)組元素讀取與輸出

數(shù)組的讀取

@a=(1..3)

單個(gè)數(shù)組元素讀?。?a=$a[1];

多個(gè)數(shù)組元素讀?。?$x,$y,$z)=@a;

變量數(shù)多于數(shù)組元素:($a,$b,$c,$d)=@a;

$a=1,$b=2,$c=3,$d=undef

變量數(shù)少于數(shù)組元素:($a,$b)=@a;$a=1,$b=2;

數(shù)組的輸出 print@a;

#輸出的數(shù)組元素相連

print“@a”;

#輸出的數(shù)組元素之間加空格

print“@a\n”;

#輸出數(shù)組的所有元素后進(jìn)行換行數(shù)組內(nèi)插于字符串?dāng)?shù)組可以插入雙引號(hào)的字符串中,插入的數(shù)組元素會(huì)自動(dòng)空格。

@rocks=qw{flintstoneslaterubble}; print“quartz@rockslimestone\n”; @fred=qw(hellodolly); $x=“Thisis$fred[1]’splace”;內(nèi)插標(biāo)量變量時(shí),不要將其與[]連在一起,否則會(huì)被誤認(rèn)為是數(shù)組元素。 @fred=qw(eatingrocksiswrong); $fred=“right”; #期望打印“thisisright[3]”

print“thisis$fred[3]\n”;

print“thisis${fred}[3]\n”; print“thisis$fred\[3]\n”; 特殊的數(shù)組索引如果將一個(gè)元素存儲(chǔ)在數(shù)組最后元素之后的位置,數(shù)組會(huì)自動(dòng)增長(zhǎng)。

$rocks[0]=‘bedrock’;

$rocks[1]=‘slate’;

$rocks[99]=‘schist’;

#除了以上三個(gè)元素,其他全為undef元素針對(duì)rocks數(shù)組,其最后一個(gè)元素的索引為$#rocks,即99。也可以用負(fù)索引值-1查看最后一個(gè)元素。

$rocks[$#rocks]=‘schist’;

$rocks[-1]=‘schist’;

獲取數(shù)組長(zhǎng)度Perl中提供了scalar函數(shù)來獲取數(shù)組長(zhǎng)度 @array=qw(thisprogramshowshowtousescalarfunction); $length=scalar(@array); print$#array,"\n"; print$length,"\n"; print$array[$#array],"\n"; print$array[$length];數(shù)組切片

訪問數(shù)組的部分元素:不是單元素,也不是全部

例如:@a=(1,2,3,4,5)

數(shù)組片斷讀出:@sub=@a[0,1,3]

#@sub=(1,2,4)

數(shù)組片斷賦值:@a[1,3]=(“a”,”b”)

#@a=(1,”a”,3,”b”,5)

數(shù)組切片的索引可用各種形式表示

例如:@a=(1,2,3,4,5)

范圍:@sub=@a[1..3] #@sub=(2,3,4)

$x=1,$y=3;

@sub=@a[$x..$y];

#@sub=(2,3,4)

@b=(1,2,3);

@sub=@a[@b]; #@sub=(2,3,4)

@b=(2,3);

@sub=@a[1,@b];

#@sub=(2,3,4)

($a,@b,$c)=(1,2,3,4,5)

數(shù)組的庫(kù)函數(shù)pop()push()shift()unshift()reverse()sort()join()split()splice()……pop和push函數(shù)

pop用來取出數(shù)組的最后一個(gè)元素并返回其值,同時(shí)該數(shù)

組會(huì)減少一個(gè)元素。 例如:@a=(1,2,3,4,5);

$i=pop(@a);

#$i=5,@a=(1,2,3,4)

注意:如果數(shù)組為空,pop什么也不做,返回undef與pop相反,push向數(shù)組的最后添加一個(gè)或多個(gè)元素。

@a=(1,2,3,4);

push(@a,5);

#現(xiàn)在是(1,2,3,4,5)

@b=(6,7);

push(@a,@b);#現(xiàn)在是

(1,2,3,4,5,6,7)shift和unshift函數(shù)push和pop對(duì)數(shù)組的末尾進(jìn)行操作,unshift和shift對(duì)一個(gè)數(shù)組的開頭進(jìn)行操作

@array=qw/dinofredbarney/;

$m=shift(@array);#$m=“dino”,@array=(“fred”,“barney”) $n=shift@array; #$n=“fred”,@array=(“barney”)

shift@array; #@array=()

$o=shift@array; #$o=undef,@array=()

unshift(@array,5); #@array=(5)

unshift@array,4; #@array=(4,5)

@others=(1..3);

unshift@array,@others;#array=(1,2,3,4,5)示例reverse和sort函數(shù)reverse(逆轉(zhuǎn))操作將輸入的一串列表或數(shù)組按相反的順序返回。

@fred=6..10; @barney=reverse(@fred);#得到10,9,8,7,6sort操作將列表排序,默認(rèn)將列表的值按ASCII值進(jìn)行升序排序。

@rocks=qw/bedrockslaterubblegranite/;

@sorted=sort(@rocks);#得到bedrock,granite,rubble,slate

@back=reversesort@rocks;#為slate到bedrock

@array=(100,97,98,101,102,99);

@numbers=sort@array;#得到100,101,102,97,98,99

@numbers=sort{$a<=>$b}@array;#得到97,98,99,100,101,102

@numbers=sort{$b<=>$a}@array;#降序排列join和split函數(shù)join函數(shù)

語(yǔ)法:join(‘連接符’,@a)

作用:把數(shù)組連接成一個(gè)字符串

#!/usr/bin/perl

@a=(1..5);

$b=join(':',@a);

print"$b\n";

split函數(shù)

語(yǔ)法:split(/模式/,分割串,長(zhǎng)度)

作用:對(duì)數(shù)組的元素進(jìn)行分隔

例如:$s="a,b,c";

@a=split(/,/,$s);

例如:@a=split(/,/,$s,2);

注意參數(shù):

第一個(gè):模式,它缺省為空格,可省略

第二個(gè):分割串,它缺省為$_,可省略

第三個(gè):長(zhǎng)度,它可省略,全部分割練習(xí):混合使用sort,join和split函數(shù)解答#!/usr/bin/perl$astring="Larry-David-Roger-Ken-Michael-Tom";$bstring="1,45,-1,39,596,89,1000";@array1=split('-',$astring);@array2=split(',',$bstring);@sort1=sort(@array1);@sort2=sort{$b<=>$a}@array2;$string1=join(',',@sort1);$string2=join('|',@sort2);print$string1;print"\n";print$string2;splice函數(shù)

在數(shù)組中用其他元素代替數(shù)組部分元素,格式為:

splice(@list,offset,length,@new)

用途:移除@list中從offset位置開始且長(zhǎng)度為length的元素,并用@new中的元素進(jìn)行替換 @array=("a","e","i","o","u"); @removedItems=splice(@array,0,3,("A","E","I")); print"Removeditems:@removedItems\n"; print"Newarray:@array";

注意: 1)如果@new的長(zhǎng)度小于length時(shí),那么只替換掉length中的部分元素; 2)如果@new的長(zhǎng)度等于length時(shí),那么將替換掉length中的所有元素; 3)如果@new的長(zhǎng)度大于length時(shí),那么將替換掉length中的所有元素,多余的元素被忽略;幾種特殊情況第一種情況:當(dāng)length=0時(shí),為數(shù)組整體插入 @a=qw(ABCD); @n=qw(EFGH);

例1:splice(@a,-1,0,@n),它表示在數(shù)組@a的最后一個(gè)

元素之前(非之后)追加@n數(shù)組中的所有元素;

例2:splice(@a,0,0,@n),它表示在數(shù)組@a的第一個(gè)元 素之前追加@n數(shù)組中的所有元素;

例3:splice(@a,$#a+1,0,@n),它表示在數(shù)組@a的最后 一個(gè)元素之后追加@n數(shù)組中的所有元素;第二種情況:當(dāng)@new為空則為刪除 例如:splice(@a,2,3),它表示跳過數(shù)組@a的前2個(gè)元素,然后將剩下數(shù)組元素中的前3個(gè)元素刪除第三種情況:當(dāng)length和@new同時(shí)省略時(shí)也為刪除 例如:splice(@a,3),它表示跳過數(shù)組@a的前3個(gè)元素,然后將剩余的所有元素刪除第四種情況:當(dāng)length為負(fù)數(shù),刪除從offset開始,到離最后為length個(gè)元素間的內(nèi)容,然后插入@new

@list=(1..20);

@new=qw(abc);

print"@list\n";

splice(@list,2,-3,@new);

print"@list\n";第五種情況:當(dāng)offset,length,@new全部省略,為清空數(shù)組Arraycontentsoffirstarraybeforesplice:CanunlocksecretArraycontentsofsecondarraybeforesplice:youthecode?Aftersplicethearraycontains:CanyoutheunlocksecretAftersplicethearraycontains:Canyoutheunlocksecretyoucode?AftersplicetheArray1contains:Canyouunlocksecretyoucode?AftersplicetheArray2contains:Canyouunlocksecretcode?FinalspliceArray3contains:Canyouunlockthesecretcode?map函數(shù)map函數(shù)對(duì)一個(gè)列表中的每個(gè)元素以一個(gè)指定的代碼塊或者表達(dá)式進(jìn)行求值運(yùn)算。格式如下:

mapEXPR,LISTforeach控制結(jié)構(gòu)格式:foreach“控制變量”(數(shù)組或列表){操作代碼},foreach$rock(qw/bedrockslatelava/){print“Onerockis$rock.\n”;#打印出3種rocks}注意:控制變量不是列表元素中的拷貝,而是這些元素本身。@rocks=qw/bedrockslatelava/;print“Therocksare:\n”,@rocks,”\n”;foreach$rock(@rocks){$rock=“\t$rock”;$rock.=“\n”;}print“Therocksare:\n”,@rocks;

默認(rèn)變量$_foreach在需要控制變量的地方,如果不加指定,會(huì)使用默認(rèn)變量$_。

foreach(1..10){

print"Icancountto$_!\n";

}其他情況也經(jīng)常使用,例如:

while(<STDIN>){

chomp;#對(duì)默認(rèn)變量$_進(jìn)行操作print; }標(biāo)量和列表上下文Perl中一個(gè)簡(jiǎn)單而重要的概念:一個(gè)給定的表達(dá)式在不同的上下文中其含義是不同的。

@people=qw(fredbarneybetty);

@sorted=sort@people;#列表context:barney,betty,fred

$number=42+@people;#標(biāo)量context:42+3,得到45

@list=@people;

$n=@people;#數(shù)字3scalar強(qiáng)制轉(zhuǎn)換為標(biāo)量上下文

@rocks=qw(talcquartzjadeobsidian);

print“Howmanyrocksdoyouhave?\n”;

print“Ihave”,@rocks,“rocks!\n”;#輸出rocks數(shù)組中的名字 print“Ihave”,scalar@rocks,“rocks!\n”;#輸出數(shù)組大小列表上下文中的<STDIN><STDIN>在標(biāo)量上下文中返回輸入的行,在列表上下文中返回輸入的段落

$line=<STDIN>; #讀入輸入的行

@lines=<STDIN>; #讀入所有的行 chomp=(@lines); #去掉所有的換行符 chomp(@lines=<STDIN>); #同上示例print"pleaseinput:\n";@lines=<STDIN>;print@lines;print"\n";$i=1;foreach$line(@lines){ print"line$i:".$line; $i++;}練習(xí):計(jì)算核酸序列中堿基個(gè)數(shù)(用split,foreach和$_完成)#!/usr/bin/perlchomp($dna=<STDIN>);@DNA=split('',$dna);$count_of_A=0;$count_of_C=0;$count_of_G=0;$count_of_T=0;foreach(@DNA){if($_eq'A'){++$count_of_A;}if($_eq'C'){++$count_of_C;}if($_eq'G'){++$count_of_G;}if($_eq'T'){++$count_of_T;}}print"A=$count_of_A\n";print"C=$count_of_C\n";print"G=$count_of_G\n";print"T=$count_of_T\n";二維數(shù)組二維數(shù)組又稱之為數(shù)組的數(shù)組,依然是一個(gè)數(shù)組,只是通過兩個(gè)下標(biāo)來訪問元素。

@AoA=(

["fred","barney","pebbles","bambam","dino",],

["george","jane","elroy","judy",],

["homer","bart","marge","maggie",],

);

print$AoA[2][1];

注意:

外面的括號(hào)是圓括號(hào),這是因?yàn)槲覀兿胍o數(shù)組賦值,所以需要圓括號(hào),不能用{}或[]。

二維數(shù)組的第一列不存儲(chǔ)具體元素而是存儲(chǔ)指向該行一維數(shù)組的引用。數(shù)組引用$ref_to_AoA=[["fred","barney","pebbles","bambam","dino",],["george","jane","elroy","judy",],["homer","bart","marge","maggie",],];print$ref_to_AoA->[2][1];注意:外面的括號(hào)現(xiàn)在變成了方括號(hào),并且訪問語(yǔ)法也有所改變。這是因?yàn)楹虲不同,在Perl中不能自由地交換數(shù)組和引用(在C中,數(shù)組和指針在很多地方可以互相代替使用)。$ref_to_AoA是一個(gè)數(shù)組引用,而@AoA是一個(gè)數(shù)組。

打印二維數(shù)組#!/usr/bin/perl@a=([3,4,10],[2,7,12],[0,3,4],[6,5,'qqq']);print"$a[0][0]\n";print"$a[0]\n";print"@a\n\n";print"@{$a[0]}\n";

#花括號(hào)不能省略print"@{$a[1]}\n";print"@{$a[2]}\n";print"@{$a[3]}\n\n";foreach$i(0..$#a){print"@{$a[$i]}\n";}#!/usr/bin/perl@a=([3,4,10],[2,7,12],[0,3,4],[6,5,'qqq'],);foreach$onedimen(@a){print"@$onedimen\n";}print"\n";foreach$i(0..$#a){$b=$a[$i];print"$b\n";$n=$#{$b};

#花括號(hào)可要可不要print"$n\n";foreach$j(0..$n){print"ele$i$jis$a[$i][$j]\n";}}添加一行新數(shù)組#!/usr/bin/perl@a=([3,4,10],[2,7,12],[0,3,4],[6,5,'qqq'],);@tmp=('GG',4,"OO");push(@a,[@tmp]);foreach$onedimen(@a){print"@$onedimen\n";}print"\n";#!/usr/bin/perl@a=([3,4,10],[2,7,12],[0,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論