Per語言入門第4版學習筆記-第三章列表和陣列

action929發表於2009-08-06

第三章列表和陣列

3.1 訪問陣列元素
3.2 特殊的陣列索引
3.3 列表
3.3.1 qw 簡寫
3.4 列表賦值
3.4.1 pop 和push 操作
3.4.2 shift 和unshift 操作
3.5 將陣列插入字串
3.6 foreach 控制結構
3.6.1 Perl 最常用的預設變數:$_
3.6.2 reverse 操作
3.6.3 sort 操作
3.7 標量和列表上下文
3.7.1 在標量Context 中使用List-Producing 表示式
3.7.2 在列表Context 中使用Scalar-Producing 表示式
3.7.3 強制轉換為標量Context
3.8 在列表Context 中
3.9 練習

[@more@]

第三章列表和陣列
列表是標量的有序集。陣列是包含列表的變數。在Perl 中這個兩個術語是可以互換的。但嚴格意義上講,列表是指資料,而陣列是其變數名。
列表和陣列可以包含任意數量的元素。最少含有0 元素,最多可以填滿你的可用記憶體。這裡又體現了Perl 的設計哲學,“沒有不必要的限制”。

3.1 訪問陣列元素
$fred[0] = “yabba”;
$fred[1]= “dabba”;
$fred[2] = “doo”;
陣列名字(本例中:fred)和標量是屬於完全不同的名稱空間(namespace)。同一程式也可以同時包含叫做$fred 的標量變數。

如果下標超出了陣列的範圍,則其值為undef。

3.2 特殊的陣列索引
$end = $#rocks; 可以獲取rocks陣列的個數
還可以用負數來訪問陣列 -1(最後一個元素),-2(中間的元素),-3(第一個元素)


3.3 列表
陣列是由括號括起來並且其元素由逗號分隔開的列表。
列表中的元素並非必須是常數,也可以是在執行此語句時再計算值的表示式
列表可以包含任意的標量值
(1,2,3) #含有1,2,3 的列表
(1,2,3,) #同上,最後一個逗號被忽略
() #空列表-0 個元素
(1 ..100) #包含100 個整數的列表

3.3.1 qw 簡寫
qw 表示“quoted words”或者“quoted by whitespace,”
(“fred”, “barney”, “betty”, “wilma”, “dino”) 可以寫成 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 )
qw{ fred barney betty wilma dino }
qw[ fred barney betty wilma dino ]
qw< fred barney betty wilma dino >

如果要在字串中使用閉分界符,很可能選擇的分界符並不太恰當。如果不想或者不能改變分界符,那可以使用反斜線():
我們處理Unix 中的檔名:
42 / 201 9/21/2006
qw{
/usr/dict/words
/home/rootbeer/.ispell_english
}


3.4 列表賦值
列表值也可以賦給變數:
($fred, $barney, $dino) = (“flintstone”, “rubble”, undef);
($fred, $barney) = ($barney, $fred) #交換兩個變數

在陣列名前加@(後沒有中括號)來引用整個陣列。
@rocks = qw / bedrock slate lava /;
@tiny = (); #空表
@giant = 1..1e5; #包含100,000 個元素的表
@stuff = (@giant, undef, @giant); #包含200,001 個元素的表

當將一個陣列複製到另一個陣列時,仍然是列表賦值。如下例:
@copy = @quarry; #將一個陣列中的值複製的另一個陣列中

3.4.1 pop 和push 操作
pop 操作將陣列的最後一個元素取出並返回:
@array = 5..9;
$fred = pop(@array); #$fred 得到9,@array 現在為(5,6,7,8)
$barney = pop @array; #$barney gets 8, @array 現在為(5,6,7)
pop @array; 現在為(5,6)(7 被丟棄了)

push,它可以將一個元素(或者一列元素)加在陣列的末尾:
push(@array,0); 現在為(5,6,0)
push @array,8; 現在為(5,6,0,8)
push @array,1..10; 現在多了10 個元素
@others =qw/9 0 2 1 0 /;
push @array,@others; 現在又多了5 個元素(共有19 個)

3.4.2 shift 和unshift 操作
push 和pop 對陣列的末尾進行操作(或者說陣列右邊有最大下標的元素,這依賴於你是怎樣思考的)。相應的,unshift 和 shift 對一個陣列的開頭進行操作(陣列的左端有最小下標的元素)

3.5 將陣列插入字串
和標量類似,陣列也可以插入雙引號的字串中。
當把email 地址插入雙引號字串時可能出現意想不到的結果。
$email ”; #錯誤!將會替換@bedrock
$email =“fred@bedrock.edu”; #正確
$email ; #另一種方法

@fred = qw(hello dolly);
$y = 2;
$x =“This is $fred[1]’s place”; # “This is dolly’s place”
$x =“This is $fred[$y-1]’s place”; #同上
索引表示式被當作普通表示式求值,看起來和不在字串中是一樣的。其變數不會首先被賦值的。換句話說,如果$y 為“2*4”,那上述表示式的值為1,而非7,因為“2*4”首先當作數字時($y 在數字表示式中)為2

3.6 foreach 控制結構
foreach $rock (qw/ bedrock slate lava /){
print “One rock is $rock.n”; #列印出3 種rocks
}
控制變數不是這些列表元素中的一個複製而是這些元素本身。也就是說,如果在迴圈中修改這個變數,那原始列表中的元素也會被修改,
迴圈結束時,變數的值會回到迴圈開始前,如果沒有值則為undef。

3.6.1 Perl 最常用的預設變數:$_
當沒有指定變數的時候,就會使用預設的變數:$_

foreach(1..10){ #使用預設的變數$_
print “I can count to $_!n”;
}

$_ =“Yabba dabba doon”;
print; #列印出預設變數$_。


3.6.2 reverse 操作
reverse(逆轉)操作將輸入的一串列表(可能是陣列)按相反的順序返回。

3.6.3 sort 操作
sort 操作將輸入的一串列表(可能是陣列)根據內部的字元順序進行排序。如對於ASCII 字串,將根據ASCII 序進行排序。


3.7 標量和列表上下文

3.7.1 在標量Context 中使用List-Producing 表示式

3.7.2 在列表Context 中使用Scalar-Producing 表示式

3.7.3 強制轉換為標量Context

3.8 在列表Context 中
@lines = ; #將輸入讀入列表context 中
在Unix 或者類似的系統中,包括linux, Mac OS X,通常可以輸入CTRL +D 來表明輸入已經結束。Perl 會忽略這個字元,因此它將在螢幕上顯示出來。在DOS/WINDOWS 系統中,使用CTRL +Z。
chomp (@lines = ); #讀入所有的行,不包括換行符當

3.9 練習
1. [6] 寫一個程式,將一些字串(不同的行)讀入一個列表中,逆向輸出它。如果是從鍵盤輸入的,那在Unix 系統中
應當使用CTRL+D 表明end-of-file,在Windows 系統中使用CTRL+Z.
2. [12] 寫一個程式,讀入一串數字(一個數字一行),將和這些數字對應的人名(下面列出的)輸出來。(將下面的人
名列表寫入程式碼中)。例如,當輸入為1,2,4 和2,則輸出的為fred, betty, dino, 和betty:
fred betty barney dino Wilma pebbles bamm-bamm
3. [8]寫一個程式,將一些字串(在不同的行中)讀入一個列表中。然後按ASCII 順序將它們輸出來。也就是說,當輸
入的字串為fred, barney, wilma, betty,則輸出為barney betty fred wilma。分別在一行或不同的行將之輸出。

1.
#!/usr/bin/perl
chomp(@a=);
@a=reverse(@a);
print @a;

2.
#!/usr/bin/perl
@b=qw (fred betty barney dino Wilma pebbles bamm-bamm);
chomp(@a=);
foreach $num (@a) {
print "$num : ".$b[$num-1]."n";
}

3.
#!/usr/bin/perl
chomp(@a=);
print sort(@a);

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

相關文章