三,列表和陣列(筆記)

tonykorn97發表於2007-06-20

列表(list)指的是標量的有序集會,而陣列(array)則是儲存列表的變數。更精確的說,列表指的是資料,而陣列指的是變數。列表值可以不放

在陣列裡,但每個陣列變數都一定包含一個列表。


1, 訪問陣列中的元素
陣列元素是以連續的整數來編號,從0開始,之後的每一個元素一次加上1。
$fred[0] = "yabba";
$fred[1] = "dabba";
$fred[2] = "doo";
陣列名本身的名稱空間(namespace)和標量名稱是完全分開的。你可以在同一個程式裡再取一個名為$fred的標量變數,perl會將兩者當成不

同的東西,而不會將其混淆。

2,特殊的陣列索引值
假如你對索引值超過陣列尾端的元素進行賦值,陣列將會依需要自動擴大--只要有可用的記憶體配置給perl,陣列的長度是沒有限制的。必要

時,插入的元素會自動產生並設成undef值。
$rocks[0] = ' bedrock '; #一個元素。。
$rocks[1] = ' slate '; #另一個
$rocks[2] = ' lava '; #再來一個
$rocks[3] = ' crushed rock '; #再來一個
$rocks[99] = ' schist '; #產生95個undef元素

有時候,你會想找出陣列裡最後一個元素的索引值。對我們正在使用的陣列rocks而言,最後一個元素的索引值是$#rocks.但是$#rocks並不

是元素的個數,因為還多出一個編號為0的元素。

$rocks[-1] = ' hard rock '; #最後一個元素

3,列表直接量
列表直接量(程式中用來表示列表值的方法)是圓括號內一串以逗號分隔的值,這些值構成了列表中的元素。
(1,2,3) #包含1,2,3這3個數字的列表
(1...100) #100個整數所構成的列表
上例中最後一個用到了第一次出現的範圍運算子(range operator),即...。這個運算子會由左邊的標量計數的右邊,每次加1,以產生

一連串的數值。
列表也可以包含任何標量值。
("fred", "barney", "betty", "wilma", "dino")

4, qw簡寫
在perl程式裡,經常需要建立簡單的單詞列表(如同前面的範例)。這時只需要用qw簡寫,便可以省去鍵入一堆額外引號的時間;
qw / fred barney betty wilma dino /
其實perl允許你以任何標點符號為界定符。例如:
qw # fred barney betty wilma dino #
qw { fred barney betty wilma dino }
qw [ fred barney betty wilma dino ]

5, 列表的賦值
像標量值可以賦值給變數一樣;列表值也可以賦值到變數
($fred,$barney,$dino) = ("flintstone" , " rubble ", undef);
($rocks[0],$rocks[1],$rocks[2],$rocks[3]) = qw / talc mica feldspar quartz /;
當希望引用整個陣列時,perl提供了一個比較簡單的符號。只要在陣列名之前加上@符號,就可以立即使用整個陣列。這個符號在賦值操作

符的兩邊都可以使用。
@rocks = qw / bedrock slate lava /;
@stuff = (@rocks,undef,@rocks);
將某個陣列複製到另外一個陣列
@copy = @quarry;

6, pop和push運算子
pop運算子可用來取出陣列中的最後一個元素並且將它返回
@array = 5...9;
$fred = pop(@array); # $fred變成9, @array現在是(5,6,7,8)
$barney = pop @array; # $barney變成8, @array現在是(5,6,7)
pop @array; # @array現在是(5,6)
和pop相反的運算子是push,它會新增一個元素(或是一串元素)到陣列的尾端;
push(@array,0); # @array現在是(5,6,0)
push @array,8 # @array現在是(5,6,0,8)
push @array,1..10;
@others = qw / 9 0 2 1 0 /;
push @array,@others;

7, shift和unshift運算子
push和pop運算子所處理的是陣列的尾端,相對的unshift和shift運算子則對應陣列的開頭

8,在字串內替換陣列
和標量一樣,陣列值可以被替換到雙引號內的字串裡。陣列中的相鄰元素在替換時會自動新增空格作為換行符。
陣列的單一元素在替換是被替換成相應的元素值。

9,foreach控制結構
能夠一次處理整個陣列或列表相當的方便,所以perl提供了一種控制結構來做這件事,foreach迴圈會逐項處理列表的值,每次對一個值執

行迴圈裡的操作:
foreach $rock (qw/ bedrock slate lava /){
print "one rock is $rock. ";
}

10,perl最愛的預設變數:$_
假如你在foreach迴圈的開頭省略了控制變數,perl會使用它最愛的預設變數,$_.
foreach (1..10){
print "I can count to $_! ";
}

11, reverse運算子
reverse運算子會讀取列表的值(可能來自陣列)並依相反的次序返回該列表
@fred = 6..10;
@barney = reverse(@fred);
@fred = reverse @fred;

12, sort運算子
sort運算子會讀取列表的值(可能來自陣列),而且會根據字元編碼的順序對它們進行排序。

13,強制指定標量上下文
使用假函式scalar,它並不是真正的函式,因為它只是告訴perl必須提供標量上下文。

14,列表上下文中的
在標量上下文中會返回輸入資料的下一行;在列表上下文中,則會返回剩餘的各行。
@lines = ; #在列表上下文中讀取標準輸入
chomp(@line); #忽略所有的換行符

簡潔的方法:
chomp (@lines = ); #讀取所有資料行,但不包含換行符

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245687/,如需轉載,請註明出處,否則將追究法律責任。

相關文章