1. 程式人生 > 其它 >(三)Perl_列表與陣列(元素訪問、特殊索引$#、qw簡寫、列表賦值等)

(三)Perl_列表與陣列(元素訪問、特殊索引$#、qw簡寫、列表賦值等)

技術標籤:Perl學習

文章目錄

一、陣列與列表介紹

   列表(list)指的是標量的有序集合,而陣列(array)則是儲存列表的變數。在Perl裡,這兩個術語常常混用,不過更明確地說,列表指的是資料,而陣列指的是變數。
  陣列或列表中的元素都是單獨的標量變數,都有相應的整數作為索引,從0開始遞增,每次加1.所以陣列和列表中的頭一個元素總是第0個元素。
  因為每個元素都是獨立不相關的標量值,所以列表或陣列中可能包含數字、字串、undef值或不同標量值的混合


  陣列和列表的定義使用@(at)符號。在Perl中不能直接宣告一個具體深度的陣列或列表,宣告列表時用括號( ),這一點區別於C語言。

二、陣列中元素的訪問——下標數字

  同C語言一樣,Perl中也用下標數字來引用陣列元素。陣列中的元素以連續的整數來編號,從0開始,之後每個元素加1。但又有所不同:

  • 陣列中元素的下標可以是能得到數字的表示式,也可以是小數,無論正負,perl編譯時會自動捨棄小數
  • 陣列元素下標超出範圍,則對應的值將會是undef
  • 陣列(列表)的列印最好加雙引號“ ”,列印結果:元素會空格開

程式碼示例:

#!/usr/bin/perl
$fred[0] = "劉備"
; $fred[1] = "張飛"; $fred[2] = "關羽"; #定義陣列array——不加括號,即@fred #宣告陣列@array = 5..9; @fr = ("劉備","張飛","關羽"); #定義列表list——(),即@fr #陣列元素的訪問——下標 print $fred[0]; ###劉備 print "\n"; print "$fred[1]\n"
; ###張飛 print @fr; ###劉備張飛關羽——列表列印 print "\n"; print @fred; ###劉備張飛關羽——陣列列印 print "\n"; #列印列表和陣列使用——加雙引號 print "@fr\n"; ###劉備 張飛 關羽 print "@fred\n"; ###劉備 張飛 關羽

編譯執行:

劉備
張飛
劉備張飛關羽
劉備張飛關羽
劉備 張飛 關羽      ###好的列印結果
劉備 張飛 關羽

三、陣列特殊索引——$#陣列名、負數索引

  在Perl中,如果對索引值超過陣列尾端的元素進行賦值,陣列將會根據需要自動擴大——只要有可用的記憶體分配即可。 如果在陣列擴充套件過程中需要建立增補元素,那麼他們的預設值是undef

  1. 陣列最後一個元素的索引值是“$#陣列名”,見示例。這個數字比陣列元素的個數少1,因為還有一個編號為0的元素。
  2. 陣列元素的索引還可以採用:從陣列尾端往回計數的“負數數值索引值”,如此,陣列最後一個元素的索引值是“-1”。

程式碼示例:

#!/usr/bin/perl
$rocks[0] = 'bed';
$rocks[1] = 'coach';
$rocks[2] = 'horse';
$rocks[5] = 'rock';
$rocks[9] = 'shock';       #擴充套件陣列

$" = ",";
print "@rocks\n";

print $rocks[$#rocks];    ###shock
print "\n";
print $#rocks;            ###$陣列名——陣列最大下標值9
print "\n";

$end = $#rocks;           #最大下標值   
$number_of_rocks = $end + 1;  #陣列元素數量
print $rocks[-1];         ###列印最後一個元素值shock
print "\n";
print $rocks[-10];        ###列印第一個值bed
print "\n";

編譯執行:

bed,coach,horse,,,rock,,,,shock        #預設值為undef
shock
9
shock
bed

四、列表操作——字元$"、qw簡寫、範圍操作…

  列表的定義同陣列一樣,也會用到@符號。而列表元素的宣告,可由圓括號內用逗號隔開的一串資料表示。實際列印結果不含有任何符號,見上述程式碼示例。關於列表的用法:

  1. $"符號:使打印出的列表元素通過不同的符號間隔開
  2. 範圍操作符:從數字左邊計數到右側,每次加1,產生連續的一串數字。
  3. qw簡寫:建立簡單的單詞列表時,省去許多無謂的引號,且逗號分隔符也可以省略。使用qw簡寫時,定界符種類不限。

程式碼示例:

#!/usr/bin/perl
# $"符號的使用方式——符號種類不限
@grades = (99,100,87,86,70);
print "@grades\n";     #列表輸出方式——99 100 87 86 70

$" = ",";
print "@grades\n";     #逗號分割輸出——99,100,87,86,70   

$" = ": ";
print "@grades\n";     #冒號分割輸出——99: 100: 87: 86: 70

#qw簡寫——定界符種類不限
@a = ("fred",'barney',"wine",'liquor');
print "@a\n";
@a = qw(fred,barney,wine,liquor);   
print "@a\n";          
@a = qw!fred,barney,wine,liquor!;    
print "@a\n";
@a = qw/fred,barney,wine,liquor/;   #任意配對符號都可以使用
print "@a\n";        #列印結果相同

@a = qw{
  /usr/bin/word
  /home/root/.ispell_english
} ;
print "@a\n";

#範圍操作符..——運用
$" = ", ";
@a = ("fred",3.5,100);	  #列表中可以有字串,數字,陣列
print "@a\n";
@a = (10..20);	          #範圍操作符..,只可從小到大,只支援整數
print "@a\n";
@a = (0..3,5,7..9);
print "@a\n";
@a = (0..$#rocks);
print "@a\n";

編譯執行:

99 100 87 86 70
99,100,87,86,70
99: 100: 87: 86: 70
fred,barney,wine,liquor
fred,barney,wine,liquor
fred,barney,wine,liquor
fred,barney,wine,liquor
/usr/bin/word, /home/root/.ispell_english
fred,3.5,100
10,11,12,13,14,15,16,17,18,19,20
0,1,2,3,5,7,8,9
0,1,2,3,4,5,6,7,8,9

五、列表賦值——一一對應

  類似標量值可以被賦值給變數一樣,列表值也可以被賦值給變數,且遵循一一對應的關係。注意,列表中的元素可以包含數字、字串、陣列、undef等

程式碼示例:

#!/usr/bin/perl
 #列表中的變數賦值
($a,$b,$c) = ('fish','cat','dog');
print "$c\n";        #列表賦值一一對應
 
($bet[0],$ebt[1],$bet[2]) = qw(fish,cat,dog);
@bet = qw(fish,cat,dog);   
print "@bet\n";
 
#列表中包含其他型別變數
@rocks = qw(bed,fish,cat);
@tiny = ();                     #空列表
@giant = (1..5);
$dan = 'hot';
@stuff = (@rocks,undef,@tiny,@giant,"add",$dan);  #11個元素,空列表不計
$" = ",";
print "@stuff\n";

#陣列到陣列的賦值
@copy = @stuff;
print "複製組copy:@copy\n";

編譯執行:

dog
fish,cat,dog
bed,fish,cat,,1,2,3,4,5,add,hot
複製組copy:bed,fish,cat,,1,2,3,4,5,add,hot