發新話題

網路管理語言 Perl 入門與實作

4.2.7 shift
由陣列頭部,取出第一個元素:
引用:
#! /usr/bin/perl

@total=(2, 4, 6, 1, 3, 5, "a", "b", "c");

$first=shift @total; # $first 應為 2

print "$first\n";

print @total;
# 此時 @total 應為 (4, 6, 1, 3, 5, "a", "b", "c");

TOP

4.2.8 unshift
由陣列頭部,置入一個元素:
引用:
#! /usr/bin/perl

@total=(2, 4, 6, 1, 3, 5, "a", "b", "c");

$f1="A";

unshift @total, $f1;

print @total;
# 此時 @total 應為 ("A", 2, 4, 6, 1, 3, 5, "a", "b", "c");
也可以置入另一個陣列:
引用:
#! /usr/bin/perl

@total=(2, 4, 6, 1, 3, 5, "a", "b", "c");

@t2=qw( John Marry Kenny );

unshift @total, @t2;

print @total;
# 此時 @total 應為 ("John", "Marry", "Kenny", 2, 4, 6, 1, 3, 5, "a", "b", "c");

TOP

4.2.9 拷貝一個陣列
將 @a 陣列的內容拷貝給 @b 陣列,方法非常簡單,如下所示:
引用:
#! /usr/bin/perl

@total=(2, 4, 6, 1, 3, 5, "a", "b", "c");

@xyz=@total;

print @xyz;
# 此時 @xyz 應為 (2, 4, 6, 1, 3, 5, "a", "b", "c");

TOP

4.2.10 將一個陣列逆轉
reverse 可以將一個陣列以相反的順序排列,並傳回排列的結果,但原陣列不受影響,如下所示:
引用:
#! /usr/bin/perl

@total=(2, 4, 6, 1, 3, 5, "a", "b", "c");

@xyz= reverse @total;

print @xyz;
# 此時 @xyz 應為 ("c", "b", "a", 5, 3, 1, 6, 4, 2);
# 但 @total 不受影響,仍為 (2, 4, 6, 1, 3, 5, "a", "b", "c");

TOP

4.2.11 將一個陣列排序
sort 可以將一個陣列以內定的順序排列(按 ASCII),並傳回排列的結果,但原陣列不受影響,如下所示:
引用:
#! /usr/bin/perl

@total=(2, 4, 6, 1, 3, 5, "a", "b", "c");

@xyz= sort @total;

print @xyz;
# 此時 @xyz 應為 (1, 2, 3, 4, 5, 6, "a", "b", "c");

print "\n\n";

@abc=reverse @xyz;
print @abc;
# 此時 @abc 應為 ("c", "b", "a", 6, 5, 4, 3, 2, 1);


再看另一個例子:

#! /usr/bin/perl

@test=(1, 4, 5, 22, 9, 101);

@mmm=sort  @test;

print join ',', @mmm, "\n\n";

# 輸出結果:

1,101,22,4,5,9,
咦! 怎麼不是按數值大小排序?當然囉! 先前有提到,sort 預設是以 ASCII 順序來排序的! 如何做到我們想要的數值排序呢?請看一下節說明。

TOP

4.2.12 將陣列以數值大小排序
sort 預設是以 ASCII 順序來排序,但我們可以改變 sort 預設的行為,改用數值大小做為排序依據,如下所示:
引用:
#! /usr/bin/perl

@test=(1, 4, 5, 22, 9, 101);

@mmm=sort {$a<=>$b} @test;

print join ',', @mmm, "\n\n";

# 輸出結果:

1,4,5,9,22,101,

真的按數值大小來排序了! (升冪)
上式中,若您想要改成降冪,可在 sort 之前再加 reverse 即可:
引用:
#! /usr/bin/perl

@test=(1, 4, 5, 22, 9, 101);

@mmm=reverse sort {$a<=>$b} @test;

print join ',', @mmm, "\n\n";

# 輸出結果:

101,22,9,5,4,1,
上式,也可以用以下方法:
引用:
#! /usr/bin/perl

@test=(1, 4, 5, 22, 9, 101);

# 把 $a 和 $b 調換,即成為降冪
@mmm=sort {$b<=>$a} @test;

print join ',', @mmm, "\n\n";

# 輸出結果:

101,22,9,5,4,1,
註:{$a<=>$b} 中 $a, $b 為 sort 預設作用的暫時變數,因此,您的變數最好不要取名為 $a, $b,以免產生不可預期的結果。

TOP

4.3 雜湊
雜湊是 hash table 的中譯,到底什麼是雜湊?

TOP

4.3.1 雜湊的定義
雜湊很類似於陣列,但陣列是以數字做索引,雜湊則以字串做索引,這是最大的不同。雜湊的索引,我們稱為鍵(key),其對應的內容,我們稱為值(value),雜湊就是由一對對的 "鍵/值" 組合而成。換言之,雜湊是把某一套資料對應到另一套資料。比如:一組身份證字號對應到一組人的姓名;藉由找出某一個身份證字號,便可找到對應人的姓名。反之亦然。這就是雜湊的妙用。

雜湊的定義由:% 加上變數名稱而組成,比如:%all,範例如下:
引用:
%all=(

"t111222333" => "王大空",

"s444555666" => "李小二",

"k333111555" => "陳大一"

);

上式定義了 %all 這個雜湊,共有三對鍵/值。

其中,

$all{"t111222333"} 代表 "王大空"
$all{"s444555666"} 代表 "李小二"
$all{"k333111555"} 代表 "陳大一"


換言之,欲存取雜湊的值,只要使用 $雜湊名{鍵} 即可。

另,以下是另一種定義雜湊的方式,結果同上:

%all=("t111222333", "王大空", "s444555666", "李小二", "k333111555", "陳大一");

上式中,每二個二個配成鍵/值,形成雜湊。再如下例:

%MMM=("M", "a", "N", "b", "A", "c", "K", "d", "G", "e");

等同於:

%MMM=(
        M => a,
        N => b,
        A => c,
        K => d,
        G => e
);

最後一對可以不用 , 號。

也可以在設定值的過程,動態產生雜湊:

$HOSTNAME{"163.26.200.1"} = "dns.tnc.edu.tw";

這樣就產生了一個雜湊:%HOSTNAME,目前擁有一對鍵/值:163.26.200.1 對應至 dns.tnc.edu.tw
以下這個例子,在迴圈中動態產雜湊 %ppp:
引用:
for ($i=1; $i<=10; $i++) {

    $ppp{"kkk$i"}="ooo$i";

        $tmp="kkk$i";

        print "kkk" . $i . "===>" . "$ppp{$tmp}", "\n";

}

# 輸出結果:

kkk1===>ooo1
kkk2===>ooo2
kkk3===>ooo3
kkk4===>ooo4
kkk5===>ooo5
kkk6===>ooo6
kkk7===>ooo7
kkk8===>ooo8
kkk9===>ooo9
kkk10===>ooo10

TOP

4.3.2 reverse 一個雜湊
利用 reverse 可以將一個雜湊的鍵/值互調成為值/鍵:
引用:
%all=(

"t111222333" => "王大空",

"s444555666" => "李小二",

"k333111555" => "陳大一"

);

%bll=reverse %all;

此時,%bll=(

"王大空" => "t111222333",

"李小二" => "s444555666",

"陳大一" => "k333111555",
);

TOP

4.3.3 雜湊的處理
以下幾種函式經常用來處理雜湊:

1.keys 取出雜湊的鍵,傳回一個陣列

2.values 取出雜湊的值,傳回一個陣列

3.each 取出雜湊的鍵/值對,傳回一個串列

4.exists 用來判斷某一雜湊中是否存在該鍵

5.delete 用來移除雜湊中某一對鍵和值


以下說明用例:

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。