perl學習之路3
Perl編程之路3
標簽: perl
列表與數組
??Perl里面代表復數的就是列表和數組
列表(list)指的是標量的有序集合, 而數組(array)則是存儲列表的變量. 在Perl這兩個屬于嘗嘗混用, 不過更精確的是, 列表指的是數據, 而數組指的是變量, 列表的值不一定放在數組里, 但每個數組一定包含一個列表(即便是不含任何元素的空列表)
??數組或列表中的每個元素, 都是單獨的標量變量, 擁有獨立的標量值, 從起始元素到終止元素的先后次序是固定的, 因為沒個元素都是獨立不相關的標量值, 所以列表或數組可能包含數字, 字符串, undef值或不同標量類型值的混合
??數組和列表可以包含任意個元素, 最小是什么都沒有, 最大則能填滿整個內存
??數組的名字空間和標量的名字空間是完全分開的, 你可以在同一個程序里再取一個相同名字的標量變量, Perl會將兩者當成不同的東西 如圖, 但是一定不要這么寫!!!!!!!!


??當然, 任何求值能得到的數字的表達式都可以用作下標, 假如他不是整數, 則會自動舍棄小數, 無論正負
1 $fred[0] = 1;
2 $fred[1] = 2;
3 $fred[2] = 3;
4 $number = 2.71828;
5 print $fred[$number - 1];
??結果應該和print $fred[1]相同
??假如超出數組的尾端, 則對應的值將會是undef。 這點和一般的標量相同, 如果從來沒有對標量變量進行過賦值, 他的值就是undef
特殊的數組索引
假如你對索引值超過數組尾端的元素進行賦值, 數組將會根據需要自動擴大----只要有可用的內存分配Perl, 數組的長度是沒有上限的. 如果在擴展過程中需要創建增補元素, 那么他們的默認取值為undef
$rocks[0] = 'bedrock'; #一個元素..
$rocks[1] = 'slate' ; #又一個...
$rocks[2] = 'lava'; #再來一個...
$rocks[3] = 'crushed rock'; #再來一個...
$rocks[99] = 'schist'; #現在有95個undef元素
取最后一個元素的值
$end= $#rocks; #99, 也就是最后一個元素的索引值
??把$#name當成索引值得做法十分常見,所以Larry為我們提供了簡寫, 從數組尾端往回計數的"負數數組索引值".不過,超出數組大小的負數索引值是不會繞回來的. 假如你在數組中有3個元素, 則有效的負數索引值為-1(最后一個元素), -2(中間的元素), -3(第一個元素).如果你用-4或者再往后的索引值,只會得到undef而不會繞回到數組尾部.(在我理解的索引值,其實就是數組下標)
$rocks[-1] = 'hard rock' #相當于給最后一個數組元素賦值
列表直接量
列表直接量(listliteral, 也就是在程序代碼中表示一列數據的寫法), 可以由圓括號內用逗號隔開的一串數據表示, 而這些數據就稱為列表元素, 如:
(1, 2, 3) #包含1, 2, 3這三個數字的列表
(1, 2, 3, ) #相同的三個數字(末尾逗號會被忽略)
("fred", 4.5) #兩個元素, "fred"和4.5
() #空列表----0個元素
(1..100) #100個整數構成的列表
上面最后一行用到了..范圍操作符, 該操作符會從左邊的數字計數到右邊, 每次加1, 以產生一連串的數字. 如:
(1.7..5.7) #范圍是一到五 但是會被去掉小數部分
(5..1) #空列表, ..這個操作符只能向上計數
(0..$#rocks) #上節的rocks數組里的所有索引數字
數組中的蒜素不必都是常數---它們可以試表達式, 在每次用到這些直接量時都會被重新計算。
列表可以包含任何標量值, 像下面這個典型的字符串列表:
("fred", "barney", "betty", "whilma", "dino")
qw簡寫
??在Perl程序里, 經常要建立簡單的單詞列表, 這時只需要使用簡寫, 就可以省去鍵入許多無謂引號的麻煩
??qw(fred barney betty wilma dino) #同上, 但更簡潔, 也更少擊鍵
??qw表示"quted word(加上引號的單詞)" ,Perl會將其當成的單引號內的字符串來處理所以, 在qw構建的列表中, 不能像雙引號內的字符串一樣使用\n或$fred。 其中的空白符(如空格、制表符以及換行符)會被拋棄, 然后剩下的就是列表的元素。因為qw算是一種引用的形式, 所以不能將注釋放在qw列表中。 有些人喜歡令每個元素單獨成行, 這樣就能排成一列, 查看和增刪都很方便 如
qw(
fred
barney
betty
wilama
dino
)
??前面兩個例子是以一對園括號作為定界符(delimiter), 其實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( this as a \ read backslash);
列表的賦值
列表值可以被賦值給變量:
($fred, $barney, $dino) = ("123", "asd", "ert");
??因為列表是子啊賦值運算開始之前建立的, 所以在Perl里互換兩個變量的值相當容易:
($fred, $barney) = ($barney, $fred);#交換兩個變量的值
($betty[0], $betty[1]) = ($$betty[1], $betty[0]);
??對列表進行賦值時, 多出來的值會被悄悄忽略掉---Perl認為:如果你真的想將這些值存放起來的話, 你必然會告知存儲位置。另一種情況, 如果變量的個數多過給定的列表值個數, 那么那些多出來的變量將會被設成undef
($fred, $barney) = qw<aaa eee ttt jjj>; #忽略掉末尾兩個元素
($wilma, $dino) = qw[flints]; #$dino的值為undef
我們可以用如下代碼來構建一個字符串數組:
($rocks[0], $rocks[1], $rocks[2], $rocks[3]) = qw/ aaa vvv dee ddgg/;
??不過當你希望引用整個數組時, Perl提供了一個比較簡單的記法。只要在數組名之前加上@字符就可以了。這種寫法在賦值操作符兩邊都可以使用:
@rocks = qw/ ddd eee gggg /;
@tiny = ( ); #空列表
@giant = 1..1e5; #包含100 000個元素的列表
@stuff = (@giant, undef, @giant); #包含200 001個元素的列表
@$dino = "granite";
@quarry = (@rocks, "crushed rock", @tiny, $dino);
??最后一行進行的賦值運算會將@quarry設成擁有5個元素的列表(ddd, eee, ggg , creshed rock, granite),因為@tiny貢獻了0個元素給這個列表(由于空列表里沒有任何元素, 也就不會有undef被賦值到列表中---但是如果需要undef我們也可以顯式寫明, 就像之前對@stuff的操作那樣),此外, 值得注意的是 數組名會被展開成它所擁有的元素列表, 因為數組只能包含標量, 不能包含其他數組, 所以數組無法成為列表里的元素, 要留意的是,將某個數組復制到另一個數組時仍然算是列表的賦值運算,只不過這些列表是存儲在數組里而已:
@copy = @quarry; #將一個數組中的列表復制到另一個數組
pop和push操作符
??要新增元素到數組尾端時, 只要將它存放到更高的索引值對應的新位置就行了,不過不大用,數組中最右側的便是最后一個元素, 也就是擁有最大索引的那個元素。因為我們常常要對這個元素進行操作, 所以Perl提供了專門的函數
pop操作符就是其中一個,它負責取出數組中最后一個元素并將其作為返回值返回
@array = 5..9;
$fred = pop(@array); # $fred 變成9, @array現在是(5,6,7,8)
$barney = pop @array; # barrey 現在變成8, @現在是(5,6,7)
pop @array # @array 現在是(5,6)。(7被拋棄了)
??最后一行是在空上下文中使用pop,所謂的“空上下文”只不過是表示返回值無處可去的一種說辭。這其實也是pop操作符常見的一種用法, 用來刪除數組中的最后一個 元素。
如果數組是空的,pop什么也不做,直接返回undef
pop后面加不加括號都可以, 這是Perl習慣之一, 只要不會因為拿掉括號而改變意愿,括號就是可省略的,push用于添加一個元素或者是一串元素到數組的尾端
push @array 1..10; #在array后面又添加了十個元素
@others = qw/ 9 0 2 1 0 /;
push @array, @others; #array又得到了5個新元素
??注意,push的第一個參數或者pop的唯一參數都必須是操作的數組變量---對列表直接量進行壓入或彈出操作是沒有意義的
shift和unshift操作符
unshift和shift操作符浙式對數組的開頭或者說左邊最低下表部分進行相應的處理, 如:
@array = qw# dino fred barney #;
$m = shift(@array); # $m變成了 “dino”,@array現在是(“fred”, “barney”)
unshift(@array, 5); #array現在是5,“fred”, “barney”
splice操作符
??splice操作符可以添加或者移除數組中間的某些元素,它最多可接受4個參數, 最后兩個是可選參數, 第一個參數當然是要操作的目標數組, 第二個參數是要操作的以為元素的開始位置, 如果僅僅給出這兩項參數, Perl會把從給定位置開始一直到末尾的全部元素取出來并返回
@array = qw(aaa bbb nnn ddd eee);
@removed = splice @array, 2; #在原來的數組中刪掉fred及其后的元素
#@removed變成qw(nnn ddd eee);
#而原先的@array變成qw(aaa bbb)
??我們可以通過第三個 參數指定要操作的元素長度,第三個參數表示要操作的元素個數。
@array = qw(aaa bbb ccc ddd eee);
@removed = splice @array, 1, 2; #刪除bbb和ccc這兩個元素
#@removed變成qw(bbb,ccc)
#而@array變成qw(aaa ddd eee)
第四個參數是要替換的列表,之前我們看到的都是如何從現有的數組拿走元素, 而其實你也可以補充新元素到原來的數組中。替換的列表長度并不一定要和拿走的元素片段一樣長:
@array = qw(a b c d e);
@removed = splice @array, 1, 2, qw(wilma); #刪除b 和 c
# @removed 變成qw(b c)
# @array 變成qw(a wilma d e)
??實際上,添加元素列表并不需要預先刪除某些元素, 把表示長度的第三個參數設為0,即可不加刪除的插入新列表
@array = qw(a s d f g);
@removed = splice @array, 1, 0, qw(www);#什么元素都不刪
# @removed 變為 qw()
#@array變為qw(a www s d f g)
??注意,www出現在s之前的位置上。 Perl從索引位置1的地方插入新列表, 然后順移原來的元素。
浙公網安備 33010602011771號