Perl數組的應用


一、列表
列表是包含在括號裏的一序列的值,可以爲任何數值,也可爲空,如:(1, 5.3 , "hello" , 2),空列表:()。
注:只含有一個數值的列表(如:(43.2) )與該數值本身(即:43.2 )是不同的,但它們可以互相轉化或賦值。
列表例:
(17, $var, "a string")
(17, 26 << 2)
(17, $var1 + $var2)
($value, "The answer is $value")

二、數組--列表的存貯
列表存貯於數組變量中,與簡單變量不同,數組變量以字符"@"打頭,如:
@array = (1, 2, 3);
注:(1)數組變量創建時初始值爲空列表:()。
(2)因爲Perl用@和$來區分數組變量和簡單變量,所以同一個名字可以同時用於數組變量和簡單變量,如:
$var = 1;
@var = (11, 27.1 , "a string");

但這樣很容易混淆,故不推薦。
1、數組的存取
對數組中的值通過下標存取,第一個元素下標爲0。試圖訪問不存在的數組元素,則結果爲NULL,但如果給超出數組大小的元素賦值,則數組自動增長,原來沒有的元素值爲NULL。如:
@array = (1, 2, 3, 4);
$scalar = $array[0];
$array[3] = 5; # now @array is (1,2,3,5)
$scalar = $array[4]; # now $scalar = null;
$array[6] = 17; # now @array is (1,2,3,5,"","",17)

數組間拷貝
@result = @original;

用數組給列表賦值
@list1 = (2, 3, 4);
@list2 = (1, @list1, 5); # @list2 = (1, 2, 3, 4, 5)

數組對簡單變量的賦值
(1) @array = (5, 7, 11);
($var1, $var2) = @array; # $var1 = 5, $var2 = 7, 11被忽略
(2) @array = (5, 7);
($var1, $var2, $var3) = @array; # $var1 = 5, $var2 = 7, $var3 ="" (null)
從標準輸入(STDIN)給變量賦值
$var = ;
@array = ; # ^D爲結束輸入的符號

2、字符串中的方括號和變量替換
"$var[0]" 爲數組@var的第一個元素。
"$var\[0]" 將字符"["轉義,等價於"$var". "[0]",$var被變量替換,[0]保持不變。
"${var}[0]" 亦等價於"$var" ."[0]"。
"$\{var}"則取消了大括號的變量替換功能,包含文字:${var}.

3、列表範圍:
(1..10) = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(2, 5..7, 11) = (2, 5, 6, 7, 11)
(3..3) = (3)
用於實數
(2.1..5.3) = (2.1, 3.1 ,4.1, 5.1)
(4.5..1.6) = ()
用於字符串
("aaa".."aad") = ("aaa","aab", "aac", "aad")
@day_of_month = ("01".."31")
可包含變量或表達式
($var1..$var2+5)
.小技巧:
$fred = "Fred";
print (("Hello, " . $fred . "!\n") x 2);
其結果爲:
Hello, Fred!
Hello, Fred!

4、數組的輸出:
(1) @array = (1, 2, 3);
print (@array, "\n");
結果爲:
123
(2) @array = (1, 2, 3);
print ("@array\n");
結果爲:
1 2 3

5、列表/數組的長度
當數組變量出現在預期簡單變量出現的地方,則Perl解釋器取其長度。
@array = (1, 2, 3);
$scalar = @array; # $scalar = 3,即@array的長度
($scalar) = @array; # $scalar = 1,即@array第一個元素的值
注:以數組的長度爲循環次數可如下編程:
$count = 1;
while ($count <= @array) {
print ("element $count: $array[$count-1]\n");
$count++;
}

6、子數組
@array = (1, 2, 3, 4, 5);
@subarray = @array[0,1]; # @subarray = (1, 2)
@subarray2 = @array[1..3]; # @subarray2 = (2,3,4)
@array[0,1] = ("string", 46); # @array =("string",46,3,4,5) now
@array[0..3] = (11, 22, 33, 44); # @array = (11,22,33,44,5) now
@array[1,2,3] = @array[3,2,4]; # @array = (11,44,33,5,5) now
@array[0..2] = @array[3,4]; # @array = (5,5,"",5,5) now
可以用子數組形式來交換元素:
@array[1,2] = @array[2,1];

7、有關數組的庫函數
(1)sort-- 按字符順序排序
@array = ("this", "is", "a","test");
@array2 = sort(@array); # @array2 = ("a","is", "test", "this")
@array = (70, 100, 8);
@array = sort(@array); # @array = (100, 70, 8) now

(2)reverse--反轉數組
@array2 = reverse(@array);
@array2 = reverse sort (@array);

(3)chop--數組去尾
chop的意義是去掉STDIN(鍵盤)輸入字符串時最後一個字符--換行符。而如果它作用到數組上,則將數組中每一個元素都做如此處理。
@list = ("rabbit", "12345","quartz");
chop (@list); # @list = ("rabbi", "1234","quart") now

(4)join/split--連接/拆分
join的第一個參數是連接所用的中間字符,其餘則爲待連接的字符數組。
$string = join(" ", "this", "is","a", "string"); # 結果爲"this is a string"
@list = ("words","and");
$string = join("::", @list, "colons"); #結果爲"words::and::colons"
@array = split(/::/,$string); # @array = ("words","and", "colons") now

---------------------------------------------------------
push:從數組的末尾加入元素。
pop :從數組的末尾取出元素
shift:從數組的開頭取出元素
unshift:從數組的開頭加入元素

例子如下:
1),push
#!/usr/bin/Perl
#######
use strict;
use warnings;

my @array = ();
for ( my $i = 1 ; $i <= 5 ; ++$i ) {
push @array, $i;
print "@array\n";
}

[root@drbd-2 crontab]# ./push.pl
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

2),pop
#!/usr/bin/Perl
#######
use strict;
use warnings;

my @array = ( 1, 2, 3, 4, 5, 6 );
while (@array) {
my $firstTotal = pop(@array);
print "@array\n";
}

[root@drbd-2 crontab]# ./pop.pl
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1

3),shift
#!/usr/bin/Perl
#######
use strict;
use warnings;

my @array = ( 1, 2, 3, 4, 5, 6 );
while (@array) {
my $firstTotal = shift(@array);
print "@array\n";
}

[root@drbd-2 crontab]# ./shift.pl
2 3 4 5 6
3 4 5 6
4 5 6
5 6
6

4),unshift
#!/usr/bin/Perl
#######
use strict;
use warnings;

my @array = ();
for ( my $i = 1; $i <= 5; ++$i ) {
unshift( @array, $i );         # add $i to front of @array
print "@array\n";              # display current @array
}

[root@drbd-2 crontab]# ./unshift.pl
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1

5),splice
操作數組中間部分的函數,該函數主要有2個作用:

(1),向數組中間插入內容
#!/usr/bin/Perl
use strict;
use warnings;

my @array = ( 0 .. 6 );
my @array1 = ( 'a' .. 'd' );
my @replaced = splice( @array, 3, 2, @array1 );

print "replaced:     @replaced\n",
"with:         @array1\n",
"resulting in: @array\n\n";

[root@drbd-2 crontab]# ./splice.pl
replaced:     3 4
with:         a b c d
resulting in: 0 1 2 a b c d 5 6

(2),刪除數組元素
#!/usr/bin/Perl
use strict;
use warnings;

my @array  = ( 0 .. 6 );
my @array1 = ( 'a' .. 'd' );
my @replaced = splice( @array, 3, 2 );

print "replaced:     @replaced\n",
"resulting in: @array\n\n";

[root@drbd-2 crontab]# ./splice.pl
replaced:     3 4
with:         a b c d
resulting in: 0 1 2 5 6

刪除到末尾
#!/usr/bin/Perl
use strict;
use warnings;

my @array  = ( 0 .. 6 );
my @array1 = ( 'a' .. 'd' );
my @replaced = splice( @array, 3 );

print "replaced:     @replaced\n",
"resulting in: @array\n\n";

[root@drbd-2 crontab]# ./splice.pl
replaced:     3 4 5 6
resulting in: 0 1 2

6),join
連接列表中的各個分離的串,生成一個新的串,返回一個標量!

#!/usr/bin/Perl
use strict;
use warnings;

my @array = ( 0 .. 6 );
my $replaced = join("\n", @array);

print "$replaced\n",

[root@drbd-2 crontab]# ./join.pl
0
1
2
3
4
5
6

7),split
把字符串進行分割並把分割後的結果放入數組中
[root@drbd-2 crontab]# Perl -le '$p=q(/var/ftp/test);@a=split(/\/ftp\//,$p);print $a[1];'
test
[root@drbd-2 crontab]# Perl -le '$p=q(/var/ftp/test);@a=split(/\/ftp\//,$p);print $a[0];'
/var

8),scalar
統計數組的長度,一般我們不用這個,直接將數組賦值給標量即可。

#!/usr/bin/Perl
use strict;
use warnings;

my @array = ( 0 .. 6 );
my $count1 = @array;
my $count2 = scalar @array;

print "$count1\n";
print "$count2\n";

[root@drbd-2 crontab]# ./join.pl
7
7

9),sort
對數組元素進行排序

#!/usr/bin/Perl
use strict;
use warnings;

my @array    = ( 0 .. 9 );
my @reversed = reverse @array;
print "Original:    @array\n";
print "Reversed:    @reversed\n\n";

# create an unsorted array of numbers and sort it
my @array2            = ( 100, 23, 9, 75, 5, 10, 2, 50, 7, 96, 1, 40 );
my @sortedLexically   = sort @array2;
my @sortedNumerically = sort { $a $b } @array2;
print "Unsorted:    @array2\n";
print "Lexically:   @sortedLexically\n";
print "Numerically: @sortedNumerically\n";

[root@drbd-2 crontab]# ./join.pl
Original:    0 1 2 3 4 5 6 7 8 9
Reversed:    9 8 7 6 5 4 3 2 1 0
Unsorted:    100 23 9 75 5 10 2 50 7 96 1 40
Lexically:   1 10 100 2 23 40 5 50 7 75 9 96
# Numerically: 1 2 5 7 9 10 23 40 50 75 96 100

---------------------------------------------------------
Perl關聯數組
關聯數組和前面說的數組類似,它包含標量數據,可用索引值來單獨選擇這些數據,和數組不同的是,關聯數組的索引值不是非負的整數而是任意的標量。這些標量稱爲Keys,可以在以後用於檢索數組中的數值。
關聯數組的元素沒有特定的順序,你可以把它們想象爲一組卡片。每張卡片上半部分是索引而下半部分是數值。
關聯數組是Perl 語言中特有的,關聯數組是一個功能強大的數組。使用關聯數組時要在前面加上 % 號,關聯數組的格式如:
%ARRAY=(key1,value1,key2,value2,key3,value3);
每一個key 都有一個相對應的值(value)。
和數組類似,$zmd,@zmd,%zmd 之間沒有任何聯繫。Perl 爲對象的不同類型保留獨立的命名空間。
下面介紹關聯數組的操作:
在關聯數組中增加、更改一對數據:ARRAY={key}=value; 在關聯數組ARRAY 中加上一對key-value,要在關聯數組名稱前加上 $ 號,而且key 的名稱要在 {} 符號之間,最後再指定key 所對應的 value 值。如果在這個關聯數組中已經有這個key 了。就會更改這個key 所對應的 value。
keys(%array) 操作符可生成由關聯數組%array中的所有當前關鍵字組成的列表。即返回奇數個元素(第1,3,5,7...個)的列表。
values(%array) 操作符返回由關聯數組 %array 中所有當前值組成的列表,即返回偶數個列表。
echo(%array) 操作符返回由一個關鍵字和一個值對構成的兩個元素的表。對同一數組再操作時返回下一對值直至結束。若沒有更多的對時,echo() 返回空表。(這在打印全部列表中很有用)
刪除一對在關聯數組中的數據:delete $ARRAY{key};delete 是Perl 所提供的函數,作用是刪除關聯數組中的一個key以及這個key 所對應的 value。使用方法是 在delete 函數之後,指定關聯數組中要刪除的 key名稱。

關聯數組的綜合舉例:
%fred=(one,"zmd",two,"cxm"); $a=$fred{one}; --- #$a 等於 "zmd"
$b=$fred{two}---#$b 等於"cxm"
$fred{two}="yes"--- #%fred=(one,"zmd",two,"yes")

@number=keys(%fred)--- #@list=(one,two)
@user=values(%fred)---#@user=("zmd","cxm")
($number,$name)=echo(%fred)--- #此時 $number 的值爲one,$name 的值爲"zmd",再執行一次$number 爲值爲two,$name 的值爲 "cxm")
@a=%fred--- #將關聯數組fred 指定給數組a,這時 @a=(one,"zmd",two,"cxm")
%b=@a---#將數組a 指定給關聯數組b,這時 %b=(one,"zmd",two,"cxm")
delete $fred{one}---#將關聯數組中key 值爲one 的一對key-value 刪除,這時 %fred=(two,"cxm")
%name=()---#把 %name 關聯數組置空。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章